ComputNik Geschrieben 14. November 2002 Geschrieben 14. November 2002 Hallo, Ich will in meinem Programm einen Clienten (meinen Rechner) mit einem anderem verbinden. Ich will also am ende einen Clienten an der Leine haben. könnt ihr mahl die Logischen schritte Posten Danke Zitieren
Net-srac Geschrieben 14. November 2002 Geschrieben 14. November 2002 Das kommt darauf an, was du unter client/client verbindung verstehst. i.d.R. sind peer to peer verbindungen so aufgebaut, das beide gleichzeitig client und server sind. Ein server hört und wartet auf eine Verbindung. Ein Client verbindet sich und sorgt für einen verbindungsaufbau. Sobald diese Verbindung aufgebaut ist, können server und client sich ganz normal "unterhalten". Wenn du jetzt also einen Client haben willst, der sich zu einem anderen Client verbinden will, und umgekehrt, müssen also beide hören, und sich verbinden können. Also Client und Server. Bei verbindungen zwischen clients über einem Server muß dieser Server halt die Nachrichtenpakete zwischen den zu ihm verbundenen Clients "vermitteln" können. Kannst du einen Anwendungsfall nennen? Dafür lassen sich besser Lösungswege erstellen. Zitieren
ComputNik Geschrieben 14. November 2002 Autor Geschrieben 14. November 2002 Ein Ping Zum Beispiel. Netzwerkstrucktur: Ich arbeite an einem Clienten der als Hauptbenutzer an einer Domain angemeldet ist. Ich will mich mit einem anderen verbinden der im Prinzip die gleiche stellung hat wie mein rechner. wie ein Ping (von meinem Rechner suche ich einen anderen, aber keinen Server.) Die Serververbindung kriege ich hin. Jetzt weis ich folgendes nicht. muß ich einen Socket erstellen dann eine Verbindung zum Server erstellen (soweit gehts) und dann muß ich ja quasi vom Server runter zu dem rechner den ich erreichen will. (wieder mit connect ?) Zitieren
Klotzkopp Geschrieben 15. November 2002 Geschrieben 15. November 2002 Wenn es um Netzwerkprogrammierung geht, haben die Begriffe "Client" und "Server" nichts mit der Netzwerkstruktur zu tun. Den Client nennt man den Computer bzw. das Programm, das die Verbindung aufbaut. Der Server ist der, der sie entgegennimmt. Du kannst Dich daher per Definition nicht mit einem "Client" verbinden. Es gibt, wie Net-srac schon geschrieben hat, zwei Möglichkeiten: 1. Dein Programm ist zugleich Server und Client. Jeder Rechner, auf dem das Programm läuft, kann sich mit jedem anderen Rechner, auf dem das Programm läuft, verbinden. 2. Es gibt einen Vermittlungsserver, der die Anfragen der Clients weiterleitet. Aber auch dann verbindet sich immer nur der Client mit dem Server. Der Server kann also nichts an einen anderen Client weiterleiten, wenn der sich vorher nicht mit dem Server verbunden hat. Mischformen sind auch möglich. Dein Ping-Beispiel fällt übrigens in die erste Kategorie, auch wenn man dabei nicht unbedingt von "Server" spricht. Originally posted by ComputNik Die Serververbindung kriege ich hin.Ist das ein bereits bestehender Dienst, oder hast du die Serverkomponente selbst geschrieben? Zitieren
nic_power Geschrieben 15. November 2002 Geschrieben 15. November 2002 Originally posted by Klotzkopp Mischformen sind auch möglich. Dein Ping-Beispiel fällt übrigens in die erste Kategorie, auch wenn man dabei nicht unbedingt von "Server" spricht. Ping ist in jedem Fall eine Sonderform, da es sich um ein eigenes Protokoll handelt (ICMP, Typ 1). ICMP-Requests werden direkt vom Protokollstack auf der Zielmaschine behandelt. Im Gegensatz dazu stehen UDP und TCP (Typ 17 bzw. Typ 6) die für den Endnutzer gedacht sind und die zur Adressierung notwendigen Portnummern mitbringen. Ein einfaches Beispiel für eine Server/Client Kommunikation findest Du beispielsweise hier: http://www.pcs.cnu.edu/~dgame/sockets/sockets.html Nic Zitieren
Net-srac Geschrieben 15. November 2002 Geschrieben 15. November 2002 Originally posted by ComputNik wie ein Ping (von meinem Rechner suche ich einen anderen, aber keinen Server.) Die Serververbindung kriege ich hin. Jetzt weis ich folgendes nicht. Was hast du eigentlich vor zu bauen?! Willst du Rechner suchen, oder eine Verbindung zu ihnen Testen? Zumindest hört es sich so an... Zitieren
ComputNik Geschrieben 15. November 2002 Autor Geschrieben 15. November 2002 Ich will eine art Chat Programm schreiben. Das heist zwei rechner miteinander verbinden und dan Daten hin und her schieben. So wie ich das jetzt verstanden habe muß sich rechner 1 mit dem Server verbinden und rechner 2 ebenfalls. Rechner 1 und 2 sind Clienten == eine verbindung aufbauen. Der Server warte auf diese Verbindung und nimmt sie entgegen. Also auf beiden Rechnern das gleiche Programm. Das Programm ertellt einen Socket und erstellt eine Verbindung zu einem Server über irgend- einen Port (Port ? == welchen nehme ich den da) So jetzt sind die verbindungen zum Server hergestellt. Wie sage ich aber jetzt dem Programm oder dem Server das diese Verbindungen die aufgebaut sind zueinander gehören? Zitieren
nic_power Geschrieben 15. November 2002 Geschrieben 15. November 2002 Einen extra Server benötigst Du dafür nicht, da beide Rechner sowohl Client als auch Server sein können (bzw. in der Lage sind, Daten zu empfangen und zu verschicken). Nic Zitieren
ComputNik Geschrieben 15. November 2002 Autor Geschrieben 15. November 2002 also läuft auf dem einem Rechner ein Client.c und auf dem anderen ein server.c? Zitieren
nic_power Geschrieben 15. November 2002 Geschrieben 15. November 2002 Auf beiden Rechnern laeuft ClientServer.c Das ganze sollte so programmiert werden, das beide Systeme sowohl Client als auch Server Funktionalität zur Verfügung stellen (da Du normalerweise nicht weisst, wer den Verbindungsaufbau initiiert). Nic Zitieren
ComputNik Geschrieben 15. November 2002 Autor Geschrieben 15. November 2002 Code: #include <stdio.h> #include <io.h> #include <winsock.h> #include <errno.h> #include <string.h> #define PORT 80 #define HOST "w2kserver" #define DIRSIZE 8192 main(argc, argv) int argc; char **argv; { char hostname[100]; char dir[DIRSIZE]; int sd; struct sockaddr_in sin; struct sockaddr_in pin; struct hostent *hp; // initialisiere Winsock WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { printf ("kann winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } printf("Initialisierung von Winsock war erfolgreich.\n"); strcpy(hostname,HOST); if (argc>2) { strcpy(hostname,argv[2]); } printf("strcpy war erfolgreich\n"); /* go find out about the desired host machine */ if ((hp = gethostbyname(hostname)) == 0) { perror("gethostbyname"); exit(1); } printf("go find out about the desired host machine\n"); /* fill in the socket structure with host information */ memset(&pin, 0, sizeof(pin)); pin.sin_family = AF_INET; pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; pin.sin_port = htons(PORT); printf("fill in the socket structure with host information\n"); /* grab an Internet domain socket */ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("socket Funktion erfolgreich\n"); /* connect to PORT on HOST */ if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) { perror("connect()"); exit(1); } printf("connect Funktion erfolgreich\n"); /* send a message to the server PORT on machine HOST */ if (send(sd, argv[1], strlen(argv[1]), 0) == -1) { perror("send"); exit(1); } printf("send message ergab keinen fehler"); /* wait for a message to come back from the server */ if (recv(sd, dir, DIRSIZE, 0) == -1) { perror("recv"); exit(1); } /* spew-out the results and bail out of here! */ printf("%s\n", dir); close(sd); } //############################# //als Quelle habe ich den Code aus dem obrigen Link benutzt. nach jedem abschnitt habe ich eine Textausgabe geschrieben um zu überprüfen an welcher stelle ein fehler auftritt: Bis zur Funktion send() funktioniert alles. die funktion recv() die überprüft ob alles angekommen ist wird nie beendet. warum nicht? Zitieren
Klotzkopp Geschrieben 15. November 2002 Geschrieben 15. November 2002 Wie sieht der dazugehörige Servercode aus? Oder sendest Du einfach etwas an einen Webserver? recv wird erst dann zurückkommen, wenn der Server die vollen 8192 Bytes, die Du haben willst, gesendet hat. Eine Anmerkung zum Stil: Anstelle der Defines solltest Du besser Konstanten verwenden, in etwa so: const unsigned short PORT = 80; const char* HOST = "w2kserver"; const int DIRSIZE = 8192; Zitieren
ComputNik Geschrieben 16. November 2002 Autor Geschrieben 16. November 2002 Ich habe mich mit einem Webserver versucht zu verbinden. Gestern hat es nicht funktioniert heute mit gleichem code schon, keine ahnung warum es nicht funktioniert hat. Versuche es jetzt mal auf meinem Zweitrechner ein Server.c laufen zu lassen und auf meinem ein client.c Zitieren
ComputNik Geschrieben 16. November 2002 Autor Geschrieben 16. November 2002 code für server.c #include <stdio.h> #include <io.h> #include <winsock.h> #include <errno.h> #include <string.h> #define PORT 80 #define DIRSIZE 8192 main() { char dir[DIRSIZE]; int sd, sd_current, cc, fromlen, tolen; int addrlen; struct sockaddr_in sin; struct sockaddr_in pin; // initialisiere Winsock WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { printf ("kann winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } printf("Initialisierung von Winsock war erfolgreich.\n"); /* get an internet domain socket */ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("Socket erstellen ergab keinen fehler.\n"); /* complete the socket structure */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = htons(PORT); printf("complete the socket structure.\n"); /* bind the socket to the port number */ if (bind(sd, (struct sockaddr *) &sin, sizeof(sin)) == -1) { perror("bind"); exit(1); } printf("bind ergab keinen fehler.\n"); /* show that we are willing to listen */ if (listen(sd, 5) == -1) { perror("listen"); exit(1); } printf("listen ergab keinen fehler.\n"); /* wait for a client to talk to us */ addrlen = sizeof (pin); if ((sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen)) == -1) { perror("accept"); exit(1); } printf("wait for client to takl to us.\n"); /* get a message from the client */ if (recv(sd_current, dir, sizeof(dir), 0) == -1) { perror("recv"); exit(1); } printf("recv ergab keinen fehler.\n"); // read_dir (dir); /* strcat (dir," DUDE");*/ /* acknowledge the message, reply w/ the file names */ if (send(sd_current, dir, strlen(dir), 0) == -1) { perror("send"); exit(1); } /* close up both sockets */ close(sd_current); close(sd); return 0; } Ich bin jetzt erst mal so weit das keine fehler kommen. allerdings kommen bei server.c keine nachrichten von client.c an. Ich habe allerdings keine ahnung woran das liegt. Zitieren
Klotzkopp Geschrieben 16. November 2002 Geschrieben 16. November 2002 Originally posted by ComputNik Ich bin jetzt erst mal so weit das keine fehler kommen. allerdings kommen bei server.c keine nachrichten von client.c an. Ich habe allerdings keine ahnung woran das liegt. Das gleiche wie oben: Du gibst bei recv an, dass 8192 Bytes gelesen werden sollen (sizeof(dir)). Ich weiß nicht, was Du beim Client als Kommandozeilenparameter angibst, aber so viel wird's wohl nicht sein. recv kommt aber, wie schon gesagt, erst zurück, wenn alle angeforderten Bytes empfangen wurden. Zitieren
ComputNik Geschrieben 16. November 2002 Autor Geschrieben 16. November 2002 char dir[DIRSIZE]; printf("%s", dir); zum ausgeben der Nachricht hab ich vergessen Jetzt geht alles so wie es gehen soll. Danke für die Hilfe. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.