我必须为学术目的创建一个基于TCP协议的“按需服务器”。客户端每次发送一个KEY和一个VALUE,我必须将它们存储在全局结构中,如下所示:
我使用一个名为“put”的函数将每个KEY和VALUE存储到struct中,并使用一个“get”函数来使用该键并找到正确的值:
我的问题是,如果客户端在结构中进行更改,则下一个客户端将无法知道。我使用信号量,以使服务器等到孩子完成然后接受下一个孩子,但我仍然有同样的问题。
我读到我必须使这个结构的内存共享,以便使用mmaps使这个工作,但我仍然找不到合适的解决方案。
我在服务器编程中迈出了第一步,每一个帮助都会很棒。
答案 0 :(得分:1)
我的问题是,如果客户在结构中进行了更改,那么下一个客户就无法知道。
如您所述,mmap()
是解决方案的一部分......
您可以使用_ shm_open() _,_ shm_unlink() _, mmap 等解决应用程序的共享内存需求,如 { {3}} 发布。 this 以获取有关共享内存的其他示例
所有要点都在链接中进行了总结,但这段摘录描述了基本概念:
shm_open()创建并打开一个新的,或打开一个现有的POSIX 共享内存对象。 POSIX共享内存对象实际上是一个 可以由不相关的进程使用的句柄来使mmap(2)相同 共享内存区域。 shm_unlink()函数执行 逆操作,删除以前创建的对象 的shm_open()。
我还想建议动态分配内存可能会根据需要为struct
创建空间。如图所示,成员的规模过大,
char keys[4096];
char values[4096];
但是在评论中你说他们只需要51个字节。然后可以将结构创建为typedef:
struct keyvalue {
char keys[51];
char values[51];
} DATA;
创建指向结构的指针实例:
DATA *pData = {0};
对其进行调整
pData = malloc(initialSize*sizeof(DATA));
随着大小要求的变化,请使用以下内容来增加内存:
DATA *tmp = {0};
tmp = realloc(pData, newSize);
if(!tmp) return -1;//ensure memory allocation successful
pData = tmp;//tmp includes previous contents of pData, and more space
... //continue using pData
不再需要时使用免费的pData。
free(pData);
要在函数中传递此结构,该函数可能如下所示:
void func1(DATA *d, int numElements)
{
...
for(i=0;i<numElements;i++)
{
strcpy(d[i]->keys, "some key");
strcpy(d[i]->values, "some value");
}
...
}
要使用pData
的副本调用该函数,如果说它有1000个元素:
func1(pData, 1000);