C++ Winsock error 10093
Ich versuche zu bauen, ein server in C++ kann die multiple Anzahl von clients. Zu diesem Zweck baute ich eine winsock-wrapper und verwenden von threading mit boost für die Kommunikation für jeden Kunden.
Stieß ich auf ein seltsames problem beim Versuch, zu akzeptieren, Kunden, habe ich eine Schleife, die wie folgt aussieht.
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++;
}
Nun, der erste Kunde akzeptiert Geldstrafe und die WSAGetLastError() gibt 0 zurück, aber nach der ersten verbunden, auch wenn ich nicht versuchen, eine andere es einfach weiter zu schreiben in der Konsole 10093, was bedeutet, dass der Accept() in der Schleife stoppped Sperrung und für einige Grund nicht akzeptieren, richtig. Ich habe online gelesen, dass diesen Fehler verursacht, nicht durch Aufruf von WSAStartup () - aber ich Tat heißt es in der socket-Konstruktor und es Tat akzeptieren in der ersten Zeit.
InformationsquelleAutor UnTraDe | 2013-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
10093 ist
WSANOTINITIALISED
, was bedeutet, dassWSACleanup()
genannt wurde, mehr Zeit alsWSAStartup()
aufgerufen wurde.Basiert auf dem code, den Sie eingegeben haben, scheint es, dass
Socket::Accept()
ist wieder einSocket
statt einerSocket*
. Wenn dem so ist, dannAccept()
ist die Schaffung einer temporärenSocket
geht out of scope sofort nachSocket *socket
zugeordnet ist. Die Chancen sind, dass dieSocket
Destruktor ruftWSACleanup()
wenn es nicht sein sollte. AufrufeWSAStartup()
undWSACleanup()
muss ausgeglichen sein zu allen Zeiten.InformationsquelleAutor Remy Lebeau
Ich hatte genau das gleiche problem, bei der Programmierung einer cross-Plattform-socket-Anwendung. Es war in Ordnung arbeiten auf linux und OS X, aber ich wurde immer diese Fehlermeldung 10093 auf windows. Um es zu beheben fügen Sie diesen code vor dem Aufruf jeder von winsock-Funktionen:
InformationsquelleAutor Yiannis Mpourkelis