Minimaler TCP Server & TCP Client in C

Ich habe mal einen minimalen Server in C geschrieben, mit dem passenden Client dazu. Es gibt wirklich nur die grundlegende ASCII Kommunikation, kein Protokoll oder ähnliches. Natürlich läuft die Verbindung intern über TCP/IP etc. Es gibt jedoch kein Protokoll auf Netzwerk-Ebene 5. Dieses müsste bei Bedarf selber entwickelt werden, bzw. auf ein bereits bestehendes sollte dann Zurückgegriffen werden.

Der Server:

#include <sys/types.h>    // für socket()
#include <sys/socket.h>   // für socket()
#include <netinet/in.h>   // für socket()
#include        // für assert()
#include        //für calloc()
#include         // für getprotobyname()
#include        // für close()
#include <arpa/inet.h>    //für inet_ntop()
#include <netinet/in.h>   //für INET_ADDRSTRLEN
#include        // für memset()
#include 
 
int main(void) {
	/* Socket erstellen - TCP, IPv4, keine Optionen */
	int lsd = socket(AF_INET, SOCK_STREAM, 0);
 
	/* IPv4, Port: 1111, jede IP-Adresse akzeptieren */
	struct sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(1111);
	saddr.sin_addr.s_addr = htons(INADDR_ANY);
 
	/* Socket an Port binden */
	bind(lsd, (struct sockaddr*) &saddr, sizeof(saddr));
 
	/* Auf Socket horchen (Listen) */
	listen(lsd, 10);
 
	while(1) {
		/* Puffer und Strukturen anlegen */
		struct sockaddr_in clientaddr;
		char buffer[10];
		bzero(buffer, sizeof(buffer));
 
		/* Auf Verbindung warten, bei Verbindung Connected-Socket erstellen */
		socklen_t clen = sizeof(clientaddr);
		int csd = accept(lsd, (struct sockaddr*) &clientaddr, &clen);
 
		/* Vom Client lesen und ausgeben */
		int bytes = recv(csd, buffer, sizeof(buffer), 0);
		printf("Der Client hat folgenden String gesendet: %s\n", buffer);
		printf("Es wurden %d Bytes empfangen\n", bytes);
 
		/* Verbindung schließen */
		close(csd);
	}
 
	close(lsd);
	return EXIT_SUCCESS;
 
}

Der Client:

#include <sys/types.h>    // für socket()
#include <sys/socket.h>   // für socket()
#include <netinet/in.h>   // für socket()
#include        // für assert()
#include         // für getprotobyname()
#include        // für close()
#include <arpa/inet.h>    //für inet_ntop()
#include         //für getaddrinfo()
#include          // für memset()
#include  
#include 
#include 
 
int main(void) {
	/* Socket erstellen */
	int socks = socket(AF_INET, SOCK_STREAM, 0);
 
	/* Verbindungsziel festlegen, Port und IP-Adresse des Servers angeben */
	struct sockaddr_in serveraddr;
	bzero(&serveraddr, sizeof(serveraddr));
	inet_pton(AF_INET, "127.0.0.1", &(serveraddr.sin_addr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(1111);
 
	/* Verbindung aufbauen */
	connect(socks, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
 
	/* Puffer mit Text füllen */
	char buffer[5];
	strcpy(buffer, "test");
 
	/* "test" String an Server senden */
	int bytes = send(socks , buffer, sizeof(buffer), 0);
 
	/* Ausgabe was gesendet wurde */
	printf("Sende String: %s\n", buffer);
	printf("Es wurden %d Bytes gesendet\n", bytes);
 
	/* Verbindung beenden */
	close(socks);
 
	return EXIT_SUCCESS;
}

Die Ausgabe der beiden C Programmie sieht so aus:

VM-Ubuntu:~/Desktop$ gcc -Wall -o server TCPServer.c
VM-Ubuntu:~/Desktop$ gcc -Wall -o client TCPClient.c
VM-Ubuntu:~/Desktop$ ./server
Der Client hat folgenden String gesendet: test
Es wurden 5 Bytes empfangen

VM-Ubuntu:~/Desktop$ ./client
Sende String: test
Es wurden 5 Bytes gesendet

Das Ganze ist, wie man sieht, sehr minimalistisch gehalten, aber so kann man denke ich am besten verstehen was passiert und wie die Netzwerkprogrammierung in C funktioniert. Falls ihr die Programme selber kompilieren wollt, benötigt ihr den aktuellen gcc (oder ähnlichen C Compiler) und die passenden Bibliotheken (unter Ubuntu build-essentials installieren)!

8 Gedanken zu „Minimaler TCP Server & TCP Client in C

  • 21. Juli 2011 um 00:11
    Permalink

    mit diesem code kannst du nur nach 127.0.0.1 verbinden.
    behebe das problem indem du

    inet_pton(AF_INET, „127.0.0.1“, &serveraddr);

    mit

    inet_pton(AF_INET, „74.125.39.103“, &(serveraddr.sin_addr));

    ersetzt

    Antworten
  • 21. Juli 2011 um 00:12
    Permalink

    ich meine
    inet_pton(AF_INET, “127.0.0.1″, &(serveraddr.sin_addr));

    damit kannst du zu jeder beliebigen addresse verbinden.

    Antworten
    • 21. Juli 2011 um 08:15
      Permalink

      Danke, habe den Fehler behoben!

      Antworten
  • 17. März 2012 um 18:06
    Permalink

    Hi,
    im Server sollte noch close(lsd); vor return EXIT_SUCCESS;
    stehen

    Antworten
  • 24. April 2012 um 21:12
    Permalink

    Ich seh die Sachen, die included werden, nicht oO

    Antworten
  • 24. April 2012 um 21:35
    Permalink

    Korrigiert, sind wohl verloren gegangen…

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.