2011-01-09 13 views
0

zuerst - es ist nicht eine Frage von "wie an den Anschluss einer anderen Software binden".mehrere UDP-Sockets, an denselben Port gebunden?

jetzt, ich habe eine Client-Server-Anwendung, basierend auf TCP, und ich möchte es UDP machen, aber ich bin etwas fehlt ..

ich habe 2 Regeln dies (was ich put) app:
1) der "Server" kann hinter Router ohne Portweiterleitung Konfiguration bleiben.
2) Der "Client" kann nur einen Port hören.

in TCP i tut es wie folgt:
1) der Server Anfangsverbindung an den Client auf dem Port X.
2) öffnet, wenn der Client es Kommunikationskanal mit dem Server öffnen will, verwendet die Ausgangsbuchse zu fragen der Server für einen neuen.
3) Der Server erstellt einen neuen Socket und verbindet sich mit dem Client an Port X. 4) Der Client akzeptiert diese neue Verbindung an Port X, und nun spricht der Client mit dem Server über diesen neuen Socket.

so kann ich mehrere Verbindungen auf dem gleichen Port haben.

in UDP, ich habe ein kleines Problem ..
1) der Server
2), wenn der Kunde will Kommunikationskanal an den Server öffnen Anforderung sendet die Anfangsverbindung dgram an den Client auf dem Port sendet X. für einen neuen Socket an die Adresse des ursprünglichen Sockets.
3) der Server empfängt die Nachricht, erstellt einen neuen Udp-Socket und verwendet es, um Daten an den Client an Port X zu senden.
4) Der Client erhält das neue dgram, und ....?

Grundsätzlich möchte ich jetzt diese Verbindung "akzeptieren". Das bedeutet: Einen neuen UDP-Socket zu erstellen, ihn auch an Port X zu binden und nur Daten von diesem spezifischen eingehenden Socket addr (ip, port) zu empfangen. aber ich kann das nicht tun, weil ich nicht mehrere Sockets an denselben Port binden kann.
Was ist also der Weg, um mehrere UDP-Verbindungen an einem Port zu erstellen? (In Art und Weise der Vernetzung nicht schaffen nur einen Ringpuffer von dgrams und an die rechten Buchse senden)

Dank :)

+1

Sie können keine Verbindung mit UDP haben, da UDP kein "verbundenes" Protokoll, sondern ein Datagrammprotokoll ist. – sfk

+1

und ich war sehr vorsichtig, nicht das "Verbindung" Wort in der UDP-Angelegenheit zu sagen. wenn ich "Verbindung" sage, bedeute ich, ein Tor für die Beantwortung zu öffnen. also was ich will, ist nur die serverseite (die von außen blockiert wird), um ein UDP-dgram an den client zu senden, damit der client später dgram an diesen sockel senden kann und dgramme von nur diesem spezifischen socket (wie tcp accept) empfängt) es war möglich, wenn ich einen neuen Socket auf dem gleichen Port binden könnte, und Daten nur von dem (IP, Port), die ich will. – RoeeK

+0

@sfk Obwohl UDP staatenloses Protokoll ist, beeinflusst der Aufruf von connect() in großem Umfang die Socket-Operationen. Unter FreeBSD können Sie beispielsweise keine Fehler (z. B. ICMP-Ziel nicht erreichbar) vom UDP-Socket erhalten, es sei denn, es ist verbunden. – WGH

Antwort

4

Da UDP verbindungsloses Protokoll ist, auf Schritt 4 können Sie den Inhalt der UDP-Nachricht überprüfen und entscheiden, wie damit umgehen. Mit anderen Worten, der Nachrichtentyp ist nur durch seinen Inhalt definiert.

Allerdings habe ich das Gefühl, dass Ihr ganzes Design ein bisschen falsch ist. Es ist viel häufiger, dass der Client hinter der Firewall ist (nur weil es mehr Clients als Server gibt). Wenn Sie den Server hinter die Firewall stellen müssen, konfigurieren Sie einfach die Firewall so, dass Verbindungen zu den Ports zugelassen werden. Selbst wenn Sie nur einen weiteren Port geöffnet haben, verhindert nichts, dass der Client sich mehrmals parallel mit demselben Server-Port verbindet.

+0

nun, diese lösung bedeutet nur das design der software und das protokoll so zu ändern, dass in jedem dgramm ein header steht, der sagt was ich damit machen soll. Ich suche nach etwas, das den Entwurf nicht ändert, also könnte ich leicht zwischen TCP- und UDP-Modi wechseln. über das Server-Client-Ding .. der "Server" ist ein Handy .. so habe ich keine gültige IP. – RoeeK

+0

@RoeeK Ja es tut, denn Ihr derzeitiges "Design" ist bei weitem nicht optimal. –

+0

Ich kann mir keinen besseren Weg vorstellen, eine Server-Client-Kommunikation zu erstellen, bei der der Server keine gültige IP-Adresse hat. Deshalb ist es so seltsam .. weil der Client mit dem Server sprechen kann, muss der Server einen Socket auf der Client-Seite öffnen .. was die Client-Seite zu einem Server macht .. also habe ich nur die klarste Terminologie, die ich habe könnte .. aber eigentlich beide Seiten sind Client und Server – RoeeK

Verwandte Themen