gpt4 book ai didi

c - 如何在 Windows 上用 C 语言将这种阻塞 I/O 模式转换为重叠 I/O 模式?

转载 作者:行者123 更新时间:2023-11-30 14:49:29 26 4
gpt4 key购买 nike

我正在学习在windows上用c语言进行套接字编程和多线程编程。我设计了一个项目,其中将有三种类型的备份节点(服务器、客户端和存储节点)。我创建了以下内容来拥有一台服务器和多个客户端和存储节点。服务器需要根据请求服务的客户端类型(显式普通客户端或存储节点)创建两种线程。我正在使用阻塞 I/O 模式。代码结构如下:

服务器:

int main()
{
//initialization and other things
while ((new_socket = accept(srv_sock, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
{
_beginthreadex(0, 0, handle_client, &new_socket, 0, 0);
}
}

uint32_t __stdcall handle_client(void *data)
{
SOCKET* sock = (SOCKET*)data;
SOCKET client_sock = *sock;
//other
recv_size = recv(client_sock, header_buf, HDR_LEN, 0);
//fixed length header

if (!strncmp(connect_with, "storageNode", strlen(connect_with)))
//check if client is a normal client or a storage node
{
_beginthreadex(0, 0, handle_storage_node, sock, 0, 0);
return 0;
}
else
{
//continue with request from normal client
}
}

uint32_t __stdcall handle_storage_node(void *data)
{
SOCKET* sock_SN = (SOCKET*)data;
SOCKET str_node_sock = *sock_SN;
//continue with request from storage node
}

我想要将其更改为重叠 I/O 的主要原因是因为有时(可能是千分之一)来自普通客户端的消息最终会作为来自存储节点的消息,而副反之亦然。我认为原因是winsock 不是严格线程安全的。另外,作为初学者,我想学习以另一种方式来做这件事。那么,重叠 I/O 实现的等效结构应该是什么?如何阻止消息传递到错误的线程?

PS:- 我是初学者,别着急!

最佳答案

你的问题不是重叠模式与否。这是您的程序对无效数据进行操作。

像这样的行

_beginthreadex(0, 0, handle_client, &new_socket, 0, 0);

您正在将堆栈上变量的地址传递给新线程。该地址将位于 while 循环迭代之外。并且很可能会在下次accept成功时用于存储下一个套接字句柄。

要解决此问题,您可以堆分配每个套接字实例并将该函数传递给您的工作线程。

重叠大多数只会让一切变得复杂。如果您不知道为什么需要它,那么就没有理由使用它。

关于c - 如何在 Windows 上用 C 语言将这种阻塞 I/O 模式转换为重叠 I/O 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49584645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com