【发布时间】:2018-09-10 02:21:37
【问题描述】:
我正在学习在 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:-我是初学者,请放心!
【问题讨论】:
-
'我认为原因是 winsock 不是严格线程安全的' - 我对此表示怀疑。我想现在有人会注意到的。 Occam 建议,任何错误更有可能出现在您自己的代码中..
-
您不需要根据客户端请求创建任何线程。你真的需要使用异步 io -
AcceptEx但不是accept、WSARecv但不是recv等
标签: c multithreading winsock blocking overlapped-io