gpt4 book ai didi

C++ Winsock 10093 错误

转载 作者:太空狗 更新时间:2023-10-29 23:25:35 27 4
gpt4 key购买 nike

我正在尝试用 C++ 构建一个可以接受多个客户端的服务器。为此,我构建了一个 winsock 包装器,并使用线程和 boost 为每个客户端进行通信。
我在尝试接受客户端时遇到了一个奇怪的问题,我有一个看起来像这样的循环。

int clientID = 0;
listenSocket = new Socket(SocketType::TCP);
listenSocket->Bind(port);
listenSocket->Listen();

while(running)
{
Socket *socket = &listenSocket->Accept();
mutex.lock();
clients.push_back(new Client(socket, clientID));
mutex.unlock();

std::cout << "Client with id " << clientID << " connected!" << std::endl;

std::cout << WSAGetLastError() << std::endl;

clientID++;
}

现在,第一个客户端接受正常并且 WSAGetLastError() 返回 0,但是在第一个连接之后,即使我不尝试连接另一个它也只是继续在控制台中写入 10093,这意味着 Accept() 在循环停止阻塞并且由于某种原因不会正确接受。我在网上看到这个错误是由于没有调用 WSAStartup() 而引起的,但我确实在套接字的构造函数中调用了它并且它确实在第一时间接受了。

最佳答案

10093 是 WSANOTINITIALISED,这意味着:

  • 在调用 WSAStartup() 之前进行套接字调用。

  • WSACleanup() 被调用的次数与 WSAStartup() 被调用的次数相同后,将进行套接字调用。

根据您提供的代码,Socket::Accept() 似乎按值返回了一个 Socket 对象,而不是 Socket* 指针。如果是这样,则 Accept() 正在创建一个临时 Socket,它会在分配 Socket *socket 后立即超出范围。 Socket 析构函数可能在不应该调用的时候调用了 WSACleanup()。对 WSAStartup()WSACleanup() 的调用必须始终保持平衡。

调用WSAStartup() 的最佳时间是在程序启动期间,而不是在对象的构造函数中。同样,调用 WSACleanup() 的最佳时间是在退出前的程序清理期间,而不是在对象的析构函数内部。

关于C++ Winsock 10093 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477148/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com