【发布时间】:2016-01-02 19:21:16
【问题描述】:
我不知道如何使用winsock 为一个简单的tcp 服务器接受多个连接。
我尝试了几种不同的方法,但不知道如何让另一个连接正常工作。对 accept() 的第一次调用似乎是唯一有效的。有人可以提供一个简单的例子来说明如何做到这一点,或者在这里解释一下listen() 和accept() 发生了什么吗?
#include <string>
#include <Winsock2.h>
WSADATA WsaData;
unsigned char packet_in[64];
unsigned short port = 29992;
unsigned int max_packet_size = sizeof(packet_in);
sockaddr_in xaddress;
SOCKET sock;
SOCKET sock1 = INVALID_SOCKET;
SOCKET sock2 = INVALID_SOCKET;
int main()
{
int r = WSAStartup( MAKEWORD(2,2), &WsaData );
xaddress.sin_family = AF_INET;
xaddress.sin_port = htons(port);
DWORD nonBlocking = 1;
sockaddr_in from;
int fromLength = sizeof( from );
int count = 0;
sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
r = bind(sock, (const sockaddr*) &xaddress, sizeof(sockaddr_in));
if (r != 0) printf("%d\n", WSAGetLastError());
r = listen(sock, SOMAXCONN);
if (r == SOCKET_ERROR)
printf("%d\n",WSAGetLastError());
ioctlsocket(sock, FIONBIO, &nonBlocking);
while(true)
{
if(count == 0)
{
sock1 = accept(sock, NULL, NULL);
}
else if (count == 1)
{
sock2 = accept(sock, NULL, NULL);
}
if(sock1 != INVALID_SOCKET)
count = 1;
if(sock2 != INVALID_SOCKET)
count = 2;
printf("%i\n",count);
}
return 0;
}
【问题讨论】:
-
它会进入您的第二个
if statement -- if (count == 1)吗?您应该在调用WSAGetLastError后发布输出和错误。 -
试试:
struct sockaddr_storage ss; socklen_t slen = sizeof(ss); SOCKET fd = accept(listener, (struct sockaddr*)&ss, &slen); ioctlsocket(sock, FIONBIO, &nonBlocking); -
摆脱非阻塞模式。在接受线程中你没有其他事情要做,或者你不应该做。