作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习在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/
我是一名优秀的程序员,十分优秀!