c - C 中 "On demand"服务器中的共享内存结构

标签 c tcp server fork shared-memory

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

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

我的问题是,如果一个客户对结构进行了更改,下一个客户将无法知道。我使用信号量以使服务器等到 child 完成后再接受下一个 child ,但我仍然遇到同样的问题。

我读到我必须共享这个结构的内存才能使用 mmap 进行这项工作,但我仍然找不到合适的解决方案。

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

最佳答案

我的问题是,如果客户端更改了结构,下一个客户端将无法知道。

如您所述,mmap() 是解决方案的一部分...
您的应用程序的共享内存需求可以通过 _ shm_open() 来解决_, _ shm_unlink() _, mmap 等,如 this 中所示 帖子。和 here 有关共享内存的其他示例

链接中总结了所有要点,但这段摘录描述了基本概念:

shm_open() creates and opens a new, or opens an existing, POSIX shared memory object. A POSIX shared memory object is in effect a handle which can be used by unrelated processes to mmap(2) the same region of shared memory. The shm_unlink() function performs the converse operation, removing an object previously created by shm_open().

我还想建议内存的动态分配可用于根据需要为您的 struct 创建空间。如图所示,成员的大小过大,

char keys[4096];
char values[4096];

但在评论中您声明它们只需要 51 个字节。然后可以将结构创建为 typedef:

struct keyvalue {
    char keys[51];
    char values[51];
} DATA;

创建指向您的结构的指针的实例:

DATA *pData = {0};

然后可以根据需要使用标准 malloc 调整大小 和或 realloc

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);

关于c - C 中 "On demand"服务器中的共享内存结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658665/

相关文章:

c - SIMD 与 Altivec : why is multiplying two vectors faster than adding two vectors?

C Windows 计算机和 Mac/Linux 计算机之间的文件传输?

c - 删除打开的 TCP 连接而不发送 RST

c - 在 C 中定义枚举

无法将指向结构的指针中的 a::c * 转换为 c *

c - errno == ENOENT 是否足以检查 C 中是否存在文件?

c# - 如何使TCP套接字保持事件状态并检测断开连接?

java - 如何在 JBoss 中禁用 HTTP OPTIONS 方法?

docker - Traefik和我的世界

java - 服务器通过端点监听端口