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)!
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
ich meine
inet_pton(AF_INET, “127.0.0.1″, &(serveraddr.sin_addr));
damit kannst du zu jeder beliebigen addresse verbinden.
Danke, habe den Fehler behoben!
Hi,
im Server sollte noch close(lsd); vor return EXIT_SUCCESS;
stehen
Stimmt, danke!
Ich seh die Sachen, die included werden, nicht oO
Korrigiert, sind wohl verloren gegangen…