Loading...
Select Version
&pagelevel(4)&pagelevel
Die beiden folgenden Programmbeispiele zeigen, wie bei verbindungsloser Kommunikation Datagramme empfangen und gesendet werden.
Die Beispielprogramme sind nur für die Kommunikationsdomäne AF_INET dargestellt, bei Änderungen entsprechend den Abschnitten "Socket-Adressierung" und "Socket erzeugen" gelten sie auch für die Domäne AF_INET6.
Beispiel 1 : Datagramme empfangen
Dieses Programm erzeugt einen Socket, ordnet ihm einen Namen zu und liest dann von dem Socket.
#include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #define TESTPORT 2222 int main(int argc, char **argv) { int sock, length, peerlen; struct sockaddr_in name, peer; char buf[1024]; /* Erzeugen des Sockets, von dem gelesen werden soll. */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); } /* Dem Socket unter Verwendung von Wildcards einen Namen zuordnen */ name.sin_family = AF_INET; name.sin_addr.s_addr = INADDR_ANY; name.sin_port = htons(TESTPORT); if (bind(sock, (struct sockaddr *)&name, sizeof name ) < 0) { perror("binding datagram socket"); exit(1); } /* Zugehörige Portnummer herausfinden und ausgeben. */ length = sizeof(name); if (getsockname(sock, (struct sockaddr *)&name, &length) < 0) { perror("getting socket name"); exit(1); } printf("Socket port #%d\n", ntohs(name.sin_port)); /* Lesen von dem Socket. */ peerlen=sizeof peer; if (recvfrom(sock, buf, 1024, (struct sockaddr *)&peer, &peerlen) < 0) { perror("receiving datagram packet"); } else { printf("-->%s\n", buf); } close(sock); exit(0); }
Beispiel 2: Datagramme senden
Dieses Programm sendet ein Datagramm an einen Empfänger, dessen Name über die Argumente in der Kommandozeile übergeben wird.
Der Programmaufruf ist: programmname rechnername portnummer
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #define DATA "The sea is calm, the tide is full . . ." int main(int argc, char **argv) { int sock; struct sockaddr_in name; struct hostent *hp; /* Socket erzeugen, über den gesendet werden soll */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); } hp = gethostbyname(argv[1]); if (hp == 0) { fprintf(stderr, "%s: unknown host\n", argv[1]); exit(2); } memcpy( (char *)&name.sin_addr, (char *)hp->h_addr, hp->h_length); name.sin_family = AF_INET; name.sin_port = htons(atoi(argv[2])); /* Nachricht senden. */ if (sendto(sock, DATA, sizeof DATA , 0, (struct sockaddr *)&name, sizeof name) < 0) { perror("sending datagram message"); } close(sock); exit(0); }