Hi, On Thu, 6 Feb 2003, Arvin Schnell wrote:
Server: socket, bind, listen, accept Client: socket, connect
Muss ich dann bei beiden den selben Port einstellen?
Ja.
Holger, hoere nicht auf Arvin, er ist verwirrt. Der Endpunkt einer TCP oder UDP Verbindung definiert sich _vollstaendig_ durch IP und Port. Ausserdem haben Endpunkte eindeutig zu sein. Wenn du also einen Rechner zum Testen von Server und Client benutzt (mithin also die IP schonmal gleich ist), muessen beide Endpunkte _unterschiedliche_ Ports haben. Allerdings: Der Port des Clients (also der Source-Port) wird automatisch alloziert, wenn du nichts weiter angibts, braucht dich also nicht weiter zu kuemmern. Was du natuerlich im Client angeben musst, ist die Zieladdresse deiner gewuenschten Verbindung, und die ist eben die IP:Port wo dein Server drauf horcht. Wenn dein Server also sowas macht, wie: socket() ... my_addr.sin_port = htons (portnumber); bind ( ..., &my_addr, ...) listen() ... Dann horcht er offenbar auf Port 'portnumber' (die IP wurde oben nicht festgelegt, er horcht also auf allen Interfaces). Der Client muss als Zieladdresse also diese ebenfalls angeben: socket() ... dest_addr.sin_port = htons (portnumber); inet_aton ("a.b.c.d", &dest_addr.sin_addr); connect (..., &dest_addr, ...) Dabei ist "a.b.c.d" also die IP des Servers, in dem Beispiel des lokalen Rechners also 127.0.0.1, oder jede andere Addresse irgendeines lokalen Netzwerk-Interfaces. Wie ersichtlich wird oben keine Addresse des lokalen Endpoints (also der Source) angegeben, sondern nur die der Destination. Das System wird sich also irgendeine freie aussuchen, die es tut (d.h. IP und Port des lokalen Endpoints werden vom System gewaehlt). Man beachte zusaetzlich, das Server nur auf Ports < 1024 horchen koennen, wenn sie als Root gestartet sind (oder die entsprechende Capability haben, aber das fuehrt zu weit). Du willst dir also einen Port > 49152 aussuchen. Ausserdem empfehle ich eine gruendliche Fehlerbehandlung, mit der kommt man trivialen Fehlern relativ schnell auf die Schliche. Also ala: int fd; if ((fd = socket (...)) < 0) { perror ("socket()"); return -1; } if (connect (fd, &dest_addr, ...) < 0) { perror ("connect()"); return -1; } Siehe auch die manpages (die man sich wirklich mal zu Gemuete fuehren sollte, da sie noch einiges mehr erklaeren) von ip(7), socket(2), connect(2), bind(2) und perror(3). Ciao, Micha.