Mit eigenem PC verbinden
-
Hallo an alle,
ich versuche grade ein Server-Programm auf meinem Pc laufen zu lassen und mich mit einem Client-Programm (das auf dem selben Pc läuft) zu verbinden. Das Serverprogramm funktioniert glaube ich auch richtig, es gibt nach dem Start den Port aus, der ihm zugewiesen wurde und wartet dann auf Verbindungen.
Wenn ich dann das Client-Programm starte, kann es sich nicht verbinden, gibt aber aus "No Error". Ich kanns leider nicht besser beschreiben aber ich poste mal einen Teil der beiden Sourcecodes:Server:
//Zugewiesenen Port ermitteln int len = sizeof(struct sockaddr); getsockname(sockfd, (struct sockaddr *) &my_addr, &len); printf ("Port: %d\n", ntohs(my_addr.sin_port)); //Auf eingehende Verbindungen warten if (listen (sockfd, 5) == -1) { perror ("listen()"); } //Verbindung annehmen int sin_size = sizeof (struct sockaddr_in); struct sockaddr_in remote_host; int sock2 = accept (sockfd, (struct sockaddr *) &remote_host, &sin_size); if (sock2 == -1) { perror ("accept()"); } //Daten senden char command[] = "Diese Nachricht kommt vom Server!"; int bytes_sent = send(sockfd, command, strlen(command), 0); if(bytes_sent == -1) { perror ("send()"); exit (EXIT_FAILURE); }
Client:
//Definieren der Serverdaten struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(5000); serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //Verbindung zum Server herstellen if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect()"); } char buf[1024]; int bytes_recv; while((bytes_recv = recv (sockfd, buf, sizeof(buf), 0)) > 0) { printf("%s", buf); } if (bytes_recv == -1) { perror ("recv()"); exit (EXIT_FAILURE); }
Die Ausgabe ist:
connect(): No error
recv(): No errorDas Server-Programm gibt jedesmal den Port 5000 aus und deshalb habe ich den zum Verbinden im Client verwendet.
Ich versucht mit "127.0.0.1", "192.168.1.2" und "localhost" aber nichts hat funktioniert.
Den Code hab ich aus einem Tutorial zusammengebastelt.Kann mir bitte jemand sagen was ich falsch mache?
LG
Namensloser
-
Hallo,
ich mach das normalerweise etwas anders beim Client:char* szServerIP = "127.0.0.1"; unsigned int serverPort = 27976; int hSocket = 0; struct sockaddr_in server_addr; struct hostent *host; if(!inet_aton(szServerIP, &server_addr.sin_addr)){ if(!(host = gethostbyname(szServerIP))){ perror("gethostbyname() failed"); return 2; } server_addr.sin_addr = *(struct in_addr*) host->h_addr; } server_addr.sin_port = htons(serverPort); server_addr.sin_family = AF_INET;
Ausserdem, wo definierst Du denn den sockfd beim client?! Das muesste vor dem connect() geschehen.
Das naechste was mir auffaellt:
if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) == -1) {
wuerde ich
if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) {
schreiben, finde ich einfacher...
recv() - Hm, nja, das kann man eleganter in ner Funktion auslagern, die sieht dann etwa so aus:
int receive_text(const int hSocket, char message[BUF_SIZ]) { int bytes = 0; // maximum size of package is BUF_SIZ! bytes = recv(hSocket, message, BUF_SIZ, 0); message[bytes] = '\0'; // doesn't make sense > BUF_SIZ, but anyway if((0 >= bytes) || (bytes > BUF_SIZ)){ perror("terminate connection"); return -1; } return 0; }
Wie Du siehst, nehme ich hier ein (fuer client und server gemeinsam definiertes) BUF_SIZ her. Was ich vorher auf eine feste Laenge setze. Du nimmst Du da ein sizeof(), das erscheint mir seltsam und koennte der Fehler sein. Das sollte aber afair die Laenge sein die Du einlesen willst. Wenn Du da die Laenge des (noch leeren) Zeigers angibst, kann er doch auch nix lesen, oder?!
Hab Deine Ansaetze jetz aus Zeitgruenden nich compiliert und getestet, aber vllt helfen die Tipps etwas.
-
Hallo Fabeltier,
erstmal danke für deine Antwort. Ich kann jetzt leider nichts ausprobieren, werde am Abend aber deine Verbesserungen versuchen zu compilieren.Also den sockfd definiere ich weiter oben, habe nicht den ganzen Code, sondern nur einen Teil gepostet. Beim Compilieren gibt es auch keinen Fehler, er kann sich nur nicht verbinden.
Zu deiner recv Funktion: Hab nicht darauf geachtet den Code übersichtlich zu halten, wollte einfach nur mal, dass es funktioniert, egal wie :-).
Ich definiere ja ein Char-Array mit 1024 Elementen. Müsste da nicht ein sizeof drauf die größe von 1024 Char Elementen zurückgeben? Oder muss ich es so machen:
1024*sizeof(char)
Bin dir auf jeden Fall mal sehr dankbar für deine Antwort. Wie gesagt, ich werds am Abend versuchen und dann posten obs funktioniert hat oder nicht.
LG
Namensloser
-
Hallo,
also ich habe es noch immer nicht hinbekommen, eine Nachricht vom Server-Programm zum Client-Programm zu senden, deshalb poste ich mal den ganzen Code.Hier ist der Code des Servers:
#include <stdio.h> #include <errno.h> #include <string.h> #include <winsock.h> int main() { WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } int sockfd = socket (AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror ("socket()"); } struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(5000); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror ("bind()"); } int len = sizeof(struct sockaddr); getsockname(sockfd, (struct sockaddr *) &my_addr, &len); printf ("Port: %d\n", ntohs(my_addr.sin_port)); if (listen (sockfd, 5) == -1) { perror ("listen()"); } int sin_size = sizeof (struct sockaddr_in); struct sockaddr_in remote_host; int sock2 = accept (sockfd, (struct sockaddr *) &remote_host, &sin_size); if (sock2 == -1) { perror ("accept()"); } char *msg = "Diese Nachricht kommt vom Server!"; len = strlen (msg); if (send (sockfd, msg, len, 0) == -1) { perror ("send()"); } closesocket(sockfd); WSACleanup(); return 0; }
Und hier der Code des Clients:
#include <stdio.h> #include <errno.h> #include <string.h> #include <winsock.h> int main() { WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } int sockfd = socket (AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror ("socket()"); } struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(5000); serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect()"); } char buf[1024]; if (recv (sockfd, buf, 1024, 0) == -1) { perror ("recv()"); } printf("%s", buf); printf ("\n"); closesocket(sockfd); WSACleanup(); return 0; }
Verbinden kann ich mich jetzt aber der Server gibt
Port: 5000 send(): No error
aus und der Client gibt
ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ZZ· ☻
aus.
Wo liegt hier der Fehler? Kann mir bitte jemand helfen.
LG
Namensloser