c++ - x 时间后如何中止 Winsock 连接

标签 c++ c++11

我目前正在开发自己的 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 的调用会立即返回,并返回 WSAEWOULDBLOCKWSAGetLastError()

关于c++ - x 时间后如何中止 Winsock 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848699/

相关文章:

codechef 中的 C++ 错误答案

java - 为什么不应该因为你 "simply prefer to program in C/C++"而用 C/C++ 编写 Android 应用程序?

c++ - 如何获取字符串的所有 1 位或相邻的 2 位数字组合

独立 std::threads 的 C++ std::vector

c++ - std::unique_ptr 试图引用已删除的函数

c++ - 嵌套 Lambda 捕获问题

C++ 反转字符串

c++ - 内部类可以访问私有(private)变量吗?

c++ - OpenCV-3.0 支持 OpenGL

c++ - 我向 HTTP 服务器发送 TCP 请求 - 但没有任何响应