ist winsock2-thread-safe?
Schreibe ich eine kleine 3 Server und 1 client-Programm. die 2 Server senden von tcp-Nachrichten und der Letzte sendet UDP-Datagramme mit winsock2.
Frage ich mich, ob ich das machen kann simulanious recvfrom() durch die Verwendung von threads (OpenMP oder boost::threads), so dass 2 threads hören von der gleichen Steckdose am gleichen port zur gleichen Zeit.
Bin ich mit VC++ 2010 auf windows7.
Danke für Eure Hilfe.
- Nein, sockets sind nicht threadsicher ist, müssen Sie ein socket pro Gewinde, jedoch mit Hilfe der windows-Meldungsschleife, die Sie Benachrichtigen können, ein thread aus einem anderen und Umgekehrt, threads selbst können message-loops.
- "TCP-Nachrichten" können fragmentiert werden; TCP ist ein bytestream-Protokoll. Wie würden Sie sich mit einer Nachricht, die Hälfte erhielt von einem thread, und die Hälfte von den anderen? Die Tatsache, dass es nicht möglich ist, schützt Sie gegen die grundlegenden design-Fehler. Erhalten und wieder zusammenbauen, die Nachrichten in einem thread (das ist nicht teuer) und dann der Versand die ganze Nachricht zur weiteren Verarbeitung an andere threads.
- Vielen Dank für Ihre Antworten. Ich werde erwägen Sie die Verwendung einer socket pro Gewinde.
- Nur ein Hinweis, für TCP es in der Regel nicht sinnvoll, gleichzeitig Aufruf recv für den gleichen sockel, aber für UDP-es ist völlig in Ordnung.
- zwei blockierende Aufrufe auf demselben thread ist eine seltene Erkrankung (denken Sie, wie könnte man das Problem möglicherweise recv, in der Regel aus einem thread, der thread ist bereits fest auf recv) und MS-Dokumentation sagt, das Ergebnis wäre Undefiniertes Verhalten, im Gegensatz zu einer gut definierten Verhalten der Rücksendung WSAEINPROGRESS in anderen Fällen. Ich bin wirklich daran interessiert zu wissen, wie es für Sie funktioniert.
- Ich habe versucht zu laufen, zwei recvfrom() in zwei threads und es nicht funktioniert, weil es sein muss WSAStartup () - Aufruf in jeder Aufgabe.
- WSAStartup müssen nicht genannt werden, indem jeder thread eines Prozesses. Es ist genug, um erfolgreich nennen es einmal in einem Prozess. Es sei denn, die zwei Fäden, die Sie erwähnt sind in verschiedenen Prozessen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Steckdosen sind thread-sicher, aber Sie müssen vorsichtig sein. Ein gemeinsames Muster (bei Verwendung von blocking IO) ist ein thread empfangen von Daten auf einem socket und einem anderen thread das senden von Daten auf der gleichen Steckdose. Mit mehreren threads empfängt Daten von einem socket ist in der Regel gut für UDP-socket, aber macht nicht viel Sinn für TCP-sockets, die meisten der Zeit. Es ist eine Warnung in der Dokumentation für Sie wsarecv:
Aber dies in der Regel nicht aus, keine Sorge, wenn Sie mit UDP und das Protokoll ist zustandslos.
Beachten Sie auch, dass die
WSAEINPROGRESS
Fehler-code bezieht sich hauptsächlich auf Winsock 1.1:Sowie die Beschreibung der
WSAEINPROGRESS
weitere Staaten:Beachten Sie, dass diese Gespräche über einen einzigen blockierungsvorgang pro task oder thread.
Darüber hinaus gibt es eine zusätzliche Warnung in der Dokumentation für Sie wsarecv:
Aber abgesehen von diesen Warnungen sollten Sie in Ordnung sein.
Update: fügen Sie einige externe Verweise:
alt.winsock.Programmierung: Ist die socket-thread-safe?
und Winsock Programmer ' s FAQ: Ist Winsock-thread-safe?
Winsock erlaubt nur eine blockierende IO-Anruf auf einem sockel. Mehr als ein blockierender Aufruf aus dem anderen thread würde am Ende mit "WSAEINPROGRESS" Fehler. http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx#WSAEINPROGRESS.
Wenn Sie möchten, um die gleichzeitige E /a-Anforderung, die Sie könnten versuchen, mithilfe von asynchronen IO oder überlappende E /a - (im windows-Jargon). Aber ich denke, Sie würde wollen, dass die gleichzeitige Verarbeitung von Daten mehr als gleichzeitige Lesen von Daten. In dem Fall könnte man ein thread Erteilung IO-Anforderungen und andere für die Verarbeitung.