C中“按需”服务器中的共享内存结构

时间:2017-04-27 13:01:58

标签: c tcp server fork shared-memory

我必须为学术目的创建一个基于TCP协议的“按需服务器”。客户端每次发送一个KEY和一个VALUE,我必须将它们存储在全局结构中,如下所示:

我使用一个名为“put”的函数将每个KEY和VALUE存储到struct中,并使用一个“get”函数来使用该键并找到正确的值:

我的问题是,如果客户端在结构中进行更改,则下一个客户端将无法知道。我使用信号量,以使服务器等到孩子完成然后接受下一个孩子,但我仍然有同样的问题。

我读到我必须使这个结构的内存共享,以便使用mmaps使这个工作,但我仍然找不到合适的解决方案。

我在服务器编程中迈出了第一步,每一个帮助都会很棒。

1 个答案:

答案 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};

然后可以根据需要使用标准 here malloc

对其进行调整
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);