Netzwerkprogrammierung mit Sockets

von STEPHAN EULER , 19.07.2005
PDF PDF | eBook eBook

Beispiel: Verbindungsorientierter Server

Mit den beschriebenen Funktionen lässt sich bereits ein Server realisieren. Als Client dient im Beispiel zunächst die Anwendung telnet. Mit dem Befehl telnet IP-Adresse Portnummer wird eine Verbindung hergestellt. Ohne physikalisches Netzwerk kann man zum Test auf dem gleichen Rechner die Loopback-Adresse localhost (127.0.0.1) verwenden. In diesem Fall gibt die Netzwerkkarte die Nachrichten direkt zurück.
Der folgende Programmcode implementiert einen einfachen Server. Der Server wartet auf Clients, schickt bei Anmeldung eine kurze Begrüßung und schließt danach unmittelbar wieder die Verbindung. Die Funktion gethostname wird dabei verwendet, um den Namen des eigenen Rechners zu erfragen. Dieser Name wird dann in den Begrüßungstext eingebaut. Zu Gunsten einer besseren Übersicht verzichtet das Beispiel auf eine Fehlerbehandlung. Die Version enthält spezielle Aufrufe für Windows-Sockets. Die Socket-Funktionen stehen in der Bibliothek ws2_32.lib. Diese muss beim Aufruf des Links zusätzlich mit angegeben sein.
#include <stdio.h>
#include <winsock2.h>

#define SERVER_PORT 1234
long WinsockStartup();

void main()
{
long rc; /* Variable fuer Rueckgabewerte */

SOCKET sockListen;
SOCKET sockConnected;
SOCKADDR_IN addr;
int addrlen = sizeof(addr);

char welcome[200];
char hostname[200];

addr.sin_addr.s_addr = 0;
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);

/* Nur unter Windows erforderlich */
rc = WinsockStartup();

/* Willkommenstext erstellen */
gethostname( hostname, sizeof hostname );
sprintf( welcome, "Willkommen bei host %s \\r\\n", hostname);

/* Socket anlegen und aktivieren */
sockListen=socket(AF_INET,SOCK_STREAM,NULL);
bind(sockListen, (SOCKADDR*)&addr, sizeof(addr));
listen(sockListen, SOMAXCONN);
/* In Endlosschleife auf Clients warten
* Begruessung schicken und
* Verbindung wieder abbauen */
for( ;; ) {
printf( "Warten auf naechste Verbindung... \\n" );
sockConnected = accept( sockListen, (SOCKADDR*)&addr, &addrlen);
rc = send( sockConnected, welcome, strlen(welcome) + 1, NULL);
printf("%d Bytes geschickt\\n", rc );

/* Windows Socket beenden */
shutdown( sockConnected, SD_SEND );
closesocket( sockConnected );
}
}

/* *************************************************
* Starte Socket Service unter Windows
*/
long WinsockStartup()
{
long rc;

/* gewünschte Version */
WORD wVersionRequested;
/* Datenstruktur fuer Info ueber Version */
WSADATA wsaData;

wVersionRequested = MAKEWORD(2, 1); /* Short Wert aus 2 Bytes */

rc = WSAStartup( wVersionRequested, &wsaData );
return rc;
}
Inhalt dieses Artikels
Links zum Artikel



Links zum Thema





Ihre Meinung zum Artikel
Benutzername:
Passwort: