Sockets in C Programmieren (Cyqwin)
-
Hallo,
ich habe noch nicht viel Erfahrung mit C Programmierung und Sockets.
Vielleicht kann mir ja hier jemand mit meinen wahrscheinlich trivialen
Fragen weiterhelfen:1. zum einstieg will ich 2 programme schicken die sich gegenseitig
messages hin und her schicken und dabei jeweils auf die andere warten.
das ganze gelöst über sockets... leider fehlt mir da komplett der
einstieg in c. ich will also simulieren das die prozesse auch auf
verschiedenen rechnern laufen können. evtl kann das ganze auch auf 3
ausgeweitet werden um einen kreislauf zu simulieren. ich hatte mir das
ganze als einstieg audgedacht da ich dachte so schwer kann es doch nicht
sein2. ist es ein problem wenn unter cyqwin die man pages zu socket...nicht
aufgerufen werden können? unter linux geht das!vielen dank schon mal
gruss
flolo
-
Zunächst einmal zu Cygwin:
Dort kannst du "ganz normal" mit Sockets arbeiten, wie unter Linux auch. Warum die Man-Pages der C-Funktionen im Cygwin-Paket nicht drin sind, habe ich mich auch schon öfter gefragt. Aber es gibt ja Online-Man-Pages im Internet (z. B. hier).
Ich selbst habe hier auch einen selbst geschriebenen HTTP-Server unter Cygwin laufen.Es gibt zahlreiche Einstiegs-Doku (Tutorials) im Internet - z. B. hier oder hier. Wenn du etwas Deutsches auf Papier suchst, kann ich dir natürlich mein Buch "C und Linux" sehr empfehlen.
Martin
-
hallo ich habe mir jetzt ein kleinees programm geschrieben allerdings habe ich noch ein problem! ich will das programm 2mal auf meinem rechner starten. und dann messages hin und her schicken leider schnappt mir aber ein programm die für das andere weg! habe ich da noch einen fehler oder wie geht das?
danke hier der code :
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <assert.h> #include <errno.h> #include <netdb.h> /* ** Länge des Empfangspuffers */ #define BUFLEN 80 int main(int argc, char **argv) { int i = 0; struct hostent *he; struct sockaddr_in addr; /* ** Argumente prüfen und holen */ if (argc < 3) { fprintf(stderr, "Usage: pingpong <id> <IP Address>\n"); exit(1); } char *id = argv[1]; /* ** Hostname holen */ if ((he = gethostbyname(argv[2])) == NULL) { printf("gethostbyname() error\n"); exit(-1); } /* ** Erzeugen des Datagramm-Sockets */ int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("Can't create socket"); exit(1); } /* ** Initialisieren der Adreß-Struktur: Port 2525 */ memset (&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(2525); addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(addr.sin_zero),8); /* ** Binden des Server-Sockets an Port 2525 */ if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { //perror("Can't bind"); //exit(2); } char buf[BUFLEN]; if (*id == '1') { do { /* ** Senden eines Datagramms an Port 2525 */ char *msg = "Ping"; int msgLen = strlen(msg)+1; int res = sendto(sockfd, msg, msgLen, 0, (struct sockaddr *)&addr, sizeof(addr)); if (res < 0) { perror("Can't write"); exit(3); } printf("Gesendet: %s\n", msg); do { /* ** Empfangen eines Datagramms ** peerAddr nimmt die Adresse des Kommunikationspartners auf */ int len = recvfrom(sockfd, buf, BUFLEN-1, 0, (struct sockaddr *)&addr, sizeof(addr)); if (len < 0) { perror("Can't read"); exit(5); } buf[BUFLEN-1] = '\0'; printf("Warten auf pong: %s\n", buf); } while (strcmp(buf, "Pong") != 0); } while (1); } else { /* ** Senden eines Datagramms an Port 2525 */ char *msg = "Pong"; int msgLen = strlen(msg)+1; int res = sendto(sockfd, msg, msgLen, 0, (struct sockaddr *)&addr, sizeof(addr)); if (res < 0) { perror("Can't write"); exit(3); } printf("Gesendet: %s\n", msg); do { /* ** Empfangen eines Datagramms ** peerAddr nimmt die Adresse des Kommunikationspartners auf */ int len = recvfrom(sockfd, buf, BUFLEN-1, 0, NULL, 0); if (len < 0) { perror("Can't read"); exit(5); } buf[BUFLEN-1] = '\0'; printf("Warten auf Ping: %s\n", buf); } while (strcmp(buf, "Ping") != 0); /* do { ** Empfangen eines Datagramms ** peerAddr nimmt die Adresse des Kommunikationspartners auf */ /* struct sockaddr_in peerAddr; int peerAddrLen = sizeof(peerAddr); int len = recvfrom(sockfd, buf, BUFLEN-1, 0,(struct sockaddr *) &peerAddr,&peerAddrLen); if (len < 0) { perror("Can't read"); exit(5); } buf[BUFLEN-1] = '\0'; printf("%s\n", buf); ** Senden eines Datagramms an Port 2525 */ /* char *msg = "Ping"; int msgLen = strlen(msg)+1; int res = sendto(sockfd, msg, msgLen, 0, (struct sockaddr *) &addr, sizeof(addr)); if (res < 0) { perror("Can't write"); exit(3); } i= i+1; } while (i<20); //(strcmp(buf, "quit") != 0); */ } /* ** Schließen des Sockets */ close(sockfd); exit(0); }
-
Du kannst nicht den gleichen Port an zwei verschiedene Prozesse "binden".
Das Prinzip, wie du die Kommunikation aufbauen willst, ist falsch: Es können keine zwei "gleichwertigen" (Server-)Programme miteinander kommunizieren. Ein Prozess muss als Server arbeiten und den Port "binden", der andere muss als Client diesen Server "connecten" (bzw. mit sendto() ansprechen).Wie gesagt, mehr dazu findest du in meinem Buch
Martin