Frage

Iam versuchen, einen iterativen Server zu erstellen, basierend auf Datagramm-Sockets (UDP). Er fordert an den ersten Client verbinden, die sie von dem ersten Recvfrom () -Aufruf werden (ja, ich weiß, das ist nicht real verbinden). Nach diesem Client gedient habe, trenne ich das UDP-Sockets (Aufruf verbindet mit AF_UNSPEC) Dann rufe ich Recvfrom (), um das erste Paket von dem nächsten Kunden zu bekommen.

Das Problem ist jetzt, dass der Aufruf von Recvfrom () in der zweiten Iteration der Schleife zurückkehrt 0 Meine Kunden nie leere Pakete senden, so was könnte los ist.

Dies ist, was Iam tun (Pseudo-Code):

s = socket(PF_INET, SOCK_DGRAM, 0)

bind(s)

for(;;)
{
  recvfrom(s, header, &client_address)  // get first packet from client
  connect(s,client_address)  // connect to this client
  serve_client(s);
  connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}

EDIT: Ich habe den Fehler in meinem Klienten gefunden versehentlich ein leeres Paket sendet. Nun mein Problem ist, wie der Kunde machen warten zu lassen diente statt eine Anfrage ins Nirgendwo Senden (Server auf einem anderen Client verbunden ist und dient keinen anderen Client noch) nicht.

War es hilfreich?

Lösung

connect () ist wirklich völlig unnötig auf SOCK_DGRAM.

Der Aufruf connect nicht stoppen Sie Pakete von anderen Hosts empfangen , Sie werden auch nicht aufhören, sie zu senden. Nur nicht die Mühe, es ist nicht wirklich hilfreich.

KORREKTUR: ja, anscheinend funktioniert es stoppen Sie Pakete von anderen Hosts zu empfangen. Aber das in einem Server zu tun ist ein bisschen dumm, weil alle anderen Kunden werden gesperrt würden, während Sie connect waren () ed zu eins. Auch müssen Sie noch auf „Spreu“, die herumschweben zu fangen. Es gibt wahrscheinlich einige Rennbedingungen im Zusammenhang mit connect () auf einer dgram Steckdose - was passiert, wenn Sie eine Verbindung anrufen und Pakete von anderen Hosts sind bereits im Puffer

Auch 0 ein gültiger Rückgabewert von Recvfrom (), als leer (keine Daten) Pakete gültig sind und existieren kann (in der Tat, die Menschen oft sie verwenden). So kann man nicht kontrollieren, ob etwas auf diese Weise gelungen ist.

Aller Wahrscheinlichkeit nach wird ein Null-Byte-Paket war bereits in der Warteschlange.

Ihr Protokoll sollte die Möglichkeit eines verirrten Datagramm wird falsch interpretiert zu minimieren konstruiert werden; Aus diesem Grunde würde ich vorschlagen, dass Sie nicht verwenden leere Datengramme, und eine magische Zahl stattdessen verwenden.

UDP-Anwendungen müssen sie erkennen „Spreu“ Pakete und Ablegen der Lage sein; sie werden früher oder später wieder auftauchen.

Andere Tipps

man connect:

...
If the initiating socket is not connection-mode, then connect()
shall set the socket’s peer address, and no connection is made.
For SOCK_DGRAM sockets, the peer address identifies where all
datagrams are sent on subsequent send() functions, and limits
the remote sender for subsequent recv() functions. If address
is a null address for the protocol,  the  socket’s  peer  address
shall be reset.
...

Nur eine Korrektur, falls jemand über diese stumbples wie ich es tat. So trennen Sie connect () muss mit dem sa_family Mitglied sockaddr auf AF_UNSPEC gesetzt aufgerufen werden. Nicht nur AF_UNSPEC übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top