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

标签 c multithreading winsock blocking overlapped-io

我正在学习在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/

相关文章:

c - 整数之和,不包括 13 和 13 之后的数字

c - 如果启用优化器,GCC 浮点错误

multithreading - C++0x 和静态局部变量中的性能损失?

c - 使用 Winsock 将客户端 TCP 套接字绑定(bind)到特定本地端口时,SO_REUSEADDR 没有任何效果

performance - 阻塞与非阻塞 winsock 的速度/性能特征

c++ - 在 Windows 上设置从套接字接收的超时

c - OpenCV 2.3 中的 cvaux230d.lib 在哪里?

c - 为什么 [0-9A-Z^%] 后不应该有 s 或 c 之类的类型说明符?

java - 一些消息在 log4j 多线程应用程序中被多次记录

java - Java 中的 IllegalMonitorStateException