Netzwerkprogrammierung
-
socke schrieb:
@progchild
Mir ist bisschen unklar was du da meinst.
Siehe hier: http://en.wikipedia.org/wiki/Inetd
Mit dem
inetd
kannst du das alles ohne dich mit Sockets auseinander setzen zu müssen umsetzen.
-
Beim Client, wie kann ich programmieren wenn a!=b!=c!=d!=d ist dass es die Variablen an den Server schickt und mit anderen Variablen vom Programm vergleicht?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORTNUMMER 6543 int main() { int socketfd; struct sockaddr_in clientaddr; int a, b, c, d, e; a=b=c=d=e = 1; socketfd = socket (PF_INET, SOCK_STREAM, 0); if (socketfd < 0) { perror ("Socket konnte nicht angelegt werden!"); exit (EXIT_FAILURE); } else { printf ("Socket wurde angelegt!\n"); } clientaddr.sin_family = PF_INET; clientaddr.sin_port = htons (PORTNUMMER); clientaddr.sin_addr.s_addr = inet_addr ("127.0.0.1"); if (connect (socketfd, (struct sockaddr*) &clientaddr, sizeof (clientaddr) ) < 0) { perror ("Verbindung mit dem Server konnte nicht hergestellt werden!"); exit (EXIT_FAILURE); } else { printf ("Verbindung mit dem Server %s wurde hergestellt!\n", inet_ntoa (clientaddr.sin_addr) ); } do { for(a=1; a<=8; a++) { for(b=1; b<=8; b++) { for(c=1; c<=8; c++) { for(d=1; d<=8; d++) { for(e=1; e<=8; e++) { if( (((a!=b)!=c)!=d)!=e ) { } } } } } } }while(); close (socketfd); return 0; }
-
Hat niemand eine Lösung wie man Daten an den Server schickt und empfängt.
-
FÜr eine Client-Server Kommunikation musste du dir erstmal - in deinem Fall wohl eher ein simples - Protokoll überlegen wie sich der Client mit dem Server verständigt.
Ein mögliches Problem ist nähmlich, dass die Pakete die du schickst nicht in einem Stück sondern aufgespaltet beim Server oder Client ankommen. Wenn du immer nur kleine Daten verschickst und das ganze auch nur über das Netzwerk kannst du das aber erstmal vernachlässigen. Das Senden von Daten geht dann einfach mit der Funktion send().blan
-
Was meinst du mit ein simples Protokoll. Ich kommuniziere über TCP/IP.
Das Senden und Empfangen geht über send und recv oder write und read.
Ich weiß jetzt nicht wie ich einrichten kann dass der Client 5 Int. Zahlen an den Server sendet.
Das Server vergleicht die Zahlen und sendet wieder an den Client ein Ergebnis.
Dann schaut sich der Client das Ergebnis an. Wenn sie nicht stimmen dann soll der Client an den Server wieder eine andere Zahlenkombination senden usw.Mir fällt nicht ein wie ich das programmieren könnte das es in diesem Ablauf passiert.
-
Dein Webbrowser arbeitet auch mit TCP/IP und benutzt dennnoch ein weiteres Protokoll - nähmlich HTTP, dass auf TCP/IP basiert.
Du kannst zum Beispiel ein Struct mit 5 Integer-Elementen erzeugen und es dann verschicken. So etwa:struct Daten { unsigned int zahl1; unsigned int zahl2; unsigned int zahl3; unsigned int zahl4; unsigned int zahl5; }; Daten daten; daten.zahl1 = 4; daten.zahl2 = 8; daten.zahl3 = 15; daten.zahl4 = 16; daten.zahl5 = 23; char *p = malloc(sizeof(Daten)); memcpy(p, &daten, sizeof(Daten)); send(socket, p, sizeof(Daten)); free(p);
so in etwa kannst du das machen - sind bestimmt paar Fehler drin, weil ich es einfach schnell ausm Kopf gecodet habe.
blan
-
was soll der sinn vom malloc/memcpy da sein? kann man auch direkt an send übergeben
-
ja das ist wohl wahr - danke
send(socket, (const void *) &daten, sizeof(Daten), 0);
so sollte es dann wohl aussehen.
blan
-
Ich habe es geschafft den Server zu starten. Im Server stehen diese Zeilen.
while(1) { len = sizeof(cliaddr); connfd=accept(listenfd, (struct sockaddr *) &cliaddr, &len); if (connfd == -1) exit(EXIT_FAILURE); ForkPID = fork() ; if (ForkPID == 0) { close(listenfd) ; dup2(connfd, 0); dup2(connfd, 1); execlp("./programm","programm",(char *)NULL); // execute a STDIN/STDOUT application } else { close (connfd) ; } } }
Wenn ich jetzt versuche programm zu kompilieren steht
/usr/bin/ld: cannot open output file programm: Is a directory collect2: ld returned 1 exit status
Was bedeutet das bzw. was kann der Fehler dahinter sein.
-
Habe es geschafft dass eine Verbindung besteht aber es führt das Programm nicht aus.
if (ForkPID == 0) { close(listenfd) ; dup2(connfd, 0); dup2(connfd, 1); execlp("/media/datei/programm","programm",(char *)NULL); }
Mit dem wird das Programm aufgerufen. Wenn ich jetzt den Server starte und versuche das Programm aufzurufen mit telnet localhost 6666 erscheint dieser Text aber das Programm wird nicht ausgeführt. Was kann der Fehler sein.
datei@datei:/media/datei$ telnet localhost 6666 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
MfG