Visual Studio 2010中的Visual C / C ++
我正在使用由其他人创建的COM服务,该服务创建运行相同例程的多个线程。在每个线程中,在套接字上调用accept()。除端口号外,套接字相同。
问题是当一个线程调用accept()时,另一个线程被阻塞。我在这个网站上读过一些关于内核空间与用户空间中的线程的其他帖子,但由于我正在实现其他人的COM接口,所以我无法控制它。
其他说明: 我尝试使用相同的端口但是bind()在一个线程中成功而在另一个线程中失败。从MSDN文档中,我知道默认情况下accept()是一个阻塞函数,但我可以选择使其成为非阻塞函数。我还没有尝试过非阻塞。
这是我的代码的要点。我修剪了错误捕捉。
iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
iRet = getaddrinfo(NULL, iniListenPort, &hints, &result);
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
// Bind socket to local address
iRet = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); // blocking
freeaddrinfo(result); // free memory allocated by getaddrinfo()
// Setup the TCP listening socket
if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
重复调用:
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL); // blocking
// We are receiving data
do {
recvRet = recv(ClientSocket, recvbuf, recvbuflen, 0); // recv() ~ blocks and waits for data to arrive
} while (recvRet > 0)