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.

InformationsquelleAutor ezzakrem | 2012-12-21
Schreibe einen Kommentar