我目前正在开发自己的 TeamSpeak3Bot
。对于连接部分,我使用的是 Microsoft 的 Winsock
库。
连接建立如下:
// Initialize Winsock
WSAData winSockData;
WORD dllVersion = MAKEWORD(2, 1);
long iResult = WSAStartup(dllVersion, &winSockData);
if (iResult != NO_ERROR)
return;
addrinfo* serverAddress = nullptr;
addrinfo* ptr = nullptr, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo("127.0.0.1", "10011", &hints, &serverAddress);
if (iResult != 0)
return;
// Create communication socket
SOCKET connectSocket = socket(AF_INET, SOCK_STREAM, /*IPPROTO_TCP*/0);
if (connectSocket == INVALID_SOCKET)
return;
// Establish connection to server
iResult = connect(connectSocket, serverAddress->ai_addr (int)serverAddress->ai_addrlen);
if (iResult == SOCKET_ERROR)
return;
// server address info not needed anymore
freeaddrinfo(serverAddress);
由于 Winsock 的 send()
和 recv()
函数首先等待相应的发送/接收操作完成,因此主线程在此期间暂停。
如何在 recv()
上正确检查接收到的输入?以及如何在特定时间(以毫秒为单位)过去后中止 recv()
?
注意:如果 send()
或 recv()
超时,我还需要能够抛出特定于类的异常!
最佳答案
一种可能性是使用非阻塞套接字,然后您可以进行轮询。
您可以通过以下方式将套接字设置为非阻塞:
ULONG mode = 1;
int res = ioctlsocket(socket, FIONBIO, &mode);
这意味着如果那里什么都没有,对 recv 的调用会立即返回,并返回 WSAEWOULDBLOCK
的 WSAGetLastError()
。
关于c++ - x 时间后如何中止 Winsock 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848699/