Kleine Frage zu Netzwerk Programmierung.
-
Hallo.
Ich bin grad dabei mein erstes Netzwerkprogramm zu schrieben. Es soll die Nachricht "Test" übermitteln. Client und Server laufen ein einem PC. Den benötigten Port habe ich freigeschaltet. Beim Server scheint alles zu funktionieren, der Client will sich aber nicht verbinden. Ich starte erst denn Server bis zur Endlosschleife und dann den Client. Sieht hier einer vielleicht den Grund?Danke
Das ist der Server:
//--------------------------------------------------------------------------- // SERVER #include <stdio.h> #include <winsock.h> int main(int argc, char* argv[]) { int sock,acc_sock,l,client_size,r; struct sockaddr_in server,client; int len; char incoming[2048]= "Nix"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } server.sin_family = AF_INET; //IP4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse server.sin_port = htons(1337); //Port 1337 if( bind(sock,(struct sockaddr *)&server, sizeof(server)) == -1){ printf("Fehler beim Binden \n"); system("pause"); exit(EXIT_FAILURE); } //ports checken getsockname(sock, (struct sockaddr *) &server, &len); printf ("Port: %d\n", ntohs(server.sin_port)); // l = listen(sock,5); if(l==-1) { printf("Fehler bei listen\n"); } system("pause"); for(;;){ client_size = sizeof(client); acc_sock = accept(sock,(struct sockaddr*) &client, &client_size); if(acc_sock < 0){printf("Fehler bei accept\n");} r = recv(acc_sock,incoming,sizeof(incoming)-1,0); if(r>=0) break; } printf("%s\n",incoming); system("pause"); return 0; } //---------------------------------------------------------------------------
Das ist der Client:
//--------------------------------------------------------------------------- // CLIENT #include <stdio.h> #include <winsock.h> int main() { int sock; struct sockaddr_in addr; char msg[] = "Test"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } addr.sin_family = AF_INET; //IP4 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse addr.sin_port = htons(1337); //Port 1337 if ( connect(sock,(struct sockaddr*) &addr, sizeof(addr)) < 0);{ printf("Fehler bei Verbindungsaufbau \n"); system("pause"); exit(EXIT_FAILURE); } printf("Verbindung aufgebaut"); send(sock,msg,strlen(msg),0); closesocket(sock); WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
-
Da sind einige Fehler drinne. Vielleicht solltest du zunächst die Programmiersprache richtig lernen.
Server:
#pragma comment(lib, "ws2_32.lib") #include <stdio.h> #include <winsock.h> #include <string.h> int main(int argc, char* argv[]) { int sock,acc_sock,l,client_size,r; struct sockaddr_in server,client; int len; char incoming[2048]= "Nix"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } // Struktur leeren memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; //IP4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse server.sin_port = htons(1337); //Port 1337 if( bind(sock,(struct sockaddr *)&server, sizeof(server)) == -1){ printf("Fehler beim Binden \n"); system("pause"); exit(EXIT_FAILURE); } //ports checken getsockname(sock, (struct sockaddr *) &server, &len); printf ("Port: %d\n", ntohs(server.sin_port)); // l = listen(sock,5); if(l==-1) { printf("Fehler bei listen\n"); } //system("pause"); // Wozu? for(;;){ client_size = sizeof(client); acc_sock = accept(sock,(struct sockaddr*) &client, &client_size); if(acc_sock < 0){printf("Fehler bei accept\n");} r = recv(acc_sock,incoming,sizeof(incoming)-1,0); if(r>=0) break; } printf("%s\n",incoming); // Sockets schließen closesocket(acc_sock); closesocket(sock); // WSA aufräumen WSACleanup(); system("pause"); return 0; }
Client:
#pragma comment(lib, "ws2_32.lib") #include <stdio.h> #include <winsock.h> int main() { int sock; struct sockaddr_in addr; char msg[] = "Test"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } // Fehler: Struktur löschen memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //IP4 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse addr.sin_port = htons(1337); //Port 1337 if ( connect(sock,(struct sockaddr*) &addr, sizeof(addr)) < 0)/*;*/{ // Semikolon dort fatal! printf("Fehler bei Verbindungsaufbau \n"); system("pause"); exit(EXIT_FAILURE); } printf("Verbindung aufgebaut"); send(sock,msg,strlen(msg),0); closesocket(sock); WSACleanup(); system("pause"); return 0; }
Weitere Fehler können nicht ausgeschlossen werden. Da es doch fatale Fehler sind empfehle ich dir dringend dich zunächst weiter mit den Grundlagen zu beschäftigen.
-
Das
#pragma comment(lib, "ws2_32.lib")
in der ersten Zeile kann natürlich entfernt werden. Das war nur damit ich die Linker-Einstellungen nicht umbasteln muss.
-
Danke
es tut jetzt, ich bin in der Tat noch nicht sehr erfahren in C und das war eben mein 1. Netzwerkprgramm. Aber ich hoffe dass die erfahrnung mit der Zeit kommt.
-
Ok ich hab versucht das jetzt ein wenig zu modifizieren, so dass beide Seiten etwas sagen können. Jedoch kommen die eingegeben Strings abgehackt bzw mit Sonderzeichen hinten dran an. Woran liegt das?
Server
//--------------------------------------------------------------------------- // SERVER #include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock,acc_sock,l,client_size; struct sockaddr_in server,client; int len; char msg[ARRAY]; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; //IP4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse server.sin_port = htons(1337); //Port 1337 if( bind(sock,(struct sockaddr *)&server, sizeof(server)) == -1){ printf("Fehler beim Binden \n"); system("pause"); exit(EXIT_FAILURE); } //ports checken getsockname(sock, (struct sockaddr *) &server, &len); printf ("Port: %d\n", ntohs(server.sin_port)); // l = listen(sock,5); if(l==-1) { printf("Fehler bei listen\n"); } //for(;;){ client_size = sizeof(client); acc_sock = accept(sock,(struct sockaddr*) &client, &client_size); if(acc_sock < 0){printf("Fehler bei accept\n");} r = recv(acc_sock,msg,sizeof(msg),0); printf("%s\n",msg); // printf("\nNachricht eingeben...: "); fgets(msg,ARRAY,stdin); send(acc_sock,msg,strlen(msg),0); printf("Gesendet>>> : %s",msg); printf("Warte auf Nachricht...\n"); recv(acc_sock,msg,strlen(msg)-1,0); printf(">>>Empfangen: %s",msg); //if(r>=0) break; // } // Sockets schließen closesocket(acc_sock); closesocket(sock); // WSA aufräumen WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
Client:
//--------------------------------------------------------------------------- // CLIENT #include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock; struct sockaddr_in addr; char msg[ARRAY] ; char con[] = "Connected"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //IP4 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse addr.sin_port = htons(1337); //Port 1337 if ( connect(sock,(struct sockaddr*) &addr, sizeof(addr)) < 0){ printf("Fehler bei Verbindungsaufbau \n"); system("pause"); exit(EXIT_FAILURE); } printf("Verbindung aufgebaut\n"); send(sock,con,strlen(con),0); // printf("Warte auf Nachricht...\n"); recv(sock,msg,strlen(msg)-1,0); printf(">>>Empfangen: %s",msg); printf("\nNachricht eingeben...:"); fgets(msg,ARRAY,stdin); send(sock,msg,strlen(msg),0); printf("Gesendet>>> : %s",msg); closesocket(sock); WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
-
Ein Beispiel, wie man es richtig macht:
char buf[1024]; int rc = recv(socket, buf, sizeof(buf) - 1, 0); if (rc > 0) { buf[rc] = '\0'; // Terminieren printf("%s", buf); } else { closesocket(socket); }
Das in C Strings mit 0 terminiert werden gehört auch zu den Grundlagen...
Hier findest du noch ein Tutorial zur Netzwerkprogrammierung. Ansonsten zieh die dort gezeigten Beispiele als Grundlage heran.
-
Werden bei eingelesenen Strings nicht automatisch ein '\0' angehängt?
Naja hab mal deine Änderung übernommen.
Ein Problem gibt es aber noch. Bei der 1. Empfangenen Nachricht kommen nur die ersten 6 Zeichen an, wieso?Das sagt der Server log:
Socket zugewiesen Port 1337 Connected Nachricht eingeben...: 1.Nachricht Gesendet>>> : 1.Nachricht Warte auf Nachricht... >>>Empfangen 2. Nachricht Drücken Sie eine beliebige Taste...
Und das der Client log:
Socket zugewiesen Verbindung aufgebaut Warte auf Nachricht... >>>Empfangen: 1.Nach Nachricht eingegeben: 2.Nachricht Gesendent>>> : 2.Nachricht Drücken Sie eine beliebige Taste...
Danke bisher.
-
Poste deinen veränderten Code nochmal.
-
Bitte sehr:D
Client
//--------------------------------------------------------------------------- // CLIENT #include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock,r; struct sockaddr_in addr; char msg[ARRAY] ; char con[] = "Connected"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //IP4 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse addr.sin_port = htons(1337); //Port 1337 if ( connect(sock,(struct sockaddr*) &addr, sizeof(addr)) < 0){ printf("Fehler bei Verbindungsaufbau \n"); system("pause"); exit(EXIT_FAILURE); } printf("Verbindung aufgebaut\n"); send(sock,con,strlen(con),0); // printf("Warte auf Nachricht...\n"); r = recv(sock,msg,strlen(msg)-1,0); msg[r] = '\0'; printf(">>>Empfangen: %s",msg); printf("\nNachricht eingeben...:"); fgets(msg,ARRAY,stdin); send(sock,msg,strlen(msg),0); printf("Gesendet>>> : %s\n",msg); closesocket(sock); WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
Server:
//--------------------------------------------------------------------------- // SERVER #include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock,acc_sock,l,client_size,r; struct sockaddr_in server,client; int len; char msg[ARRAY]; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; //IP4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse server.sin_port = htons(1337); //Port 1337 if( bind(sock,(struct sockaddr *)&server, sizeof(server)) == -1){ printf("Fehler beim Binden \n"); system("pause"); exit(EXIT_FAILURE); } //ports checken getsockname(sock, (struct sockaddr *) &server, &len); printf ("Port: %d\n", ntohs(server.sin_port)); // l = listen(sock,5); if(l==-1) { printf("Fehler bei listen\n"); } //for(;;){ client_size = sizeof(client); acc_sock = accept(sock,(struct sockaddr*) &client, &client_size); if(acc_sock < 0){printf("Fehler bei accept\n");} r = recv(acc_sock,msg,sizeof(msg)-1,0); msg[r] = '\0'; printf("%s",msg); // printf("\nNachricht eingeben...: "); fgets(msg,ARRAY,stdin); send(acc_sock,msg,strlen(msg),0); printf("Gesendet>>> : %s\n",msg); printf("Warte auf Nachricht...\n"); r = recv(acc_sock,msg,strlen(msg)-1,0); msg[r] = '\0'; printf(">>>Empfangen: %s\n",msg); //if(r>=0) break; // } // Sockets schließen closesocket(acc_sock); closesocket(sock); // WSA aufräumen WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
-
Server:
#include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock,acc_sock,l,client_size,r; struct sockaddr_in server,client; int len; char msg[ARRAY]; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; //IP4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse server.sin_port = htons(1337); //Port 1337 if( bind(sock,(struct sockaddr *)&server, sizeof(server)) == -1){ printf("Fehler beim Binden \n"); system("pause"); exit(EXIT_FAILURE); } //ports checken getsockname(sock, (struct sockaddr *) &server, &len); printf ("Port: %d\n", ntohs(server.sin_port)); // l = listen(sock,5); if(l==-1) { printf("Fehler bei listen\n"); } //for(;;){ client_size = sizeof(client); acc_sock = accept(sock,(struct sockaddr*) &client, &client_size); if(acc_sock < 0){printf("Fehler bei accept\n");} r = recv(acc_sock,msg,sizeof(msg)-1,0); msg[r] = '\0'; printf("%s",msg); // printf("\nNachricht eingeben...: "); fgets(msg,ARRAY,stdin); send(acc_sock,msg,strlen(msg),0); // Hier ist strlen korrekt printf("Gesendet>>> : %s\n",msg); printf("Warte auf Nachricht...\n"); r = recv(acc_sock,msg,sizeof(msg)-1,0); // aber hier muss sizeof verwendet werden! msg[r] = '\0'; printf(">>>Empfangen: %s\n",msg); //if(r>=0) break; // } // Sockets schließen closesocket(acc_sock); closesocket(sock); // WSA aufräumen WSACleanup(); system("pause"); return 0; }
Client:
#include <stdio.h> #include <winsock.h> #define ARRAY 2048 int main() { int sock,r; struct sockaddr_in addr; char msg[ARRAY] ; char con[] = "Connected"; WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } sock = socket(AF_INET,SOCK_STREAM,0); if(sock==-1) { printf("Fehler bei Socketanforderung \n"); system("pause"); exit(EXIT_FAILURE); } else{ printf("Socket zugewiesen\n"); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //IP4 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Adresse addr.sin_port = htons(1337); //Port 1337 if ( connect(sock,(struct sockaddr*) &addr, sizeof(addr)) < 0){ printf("Fehler bei Verbindungsaufbau \n"); system("pause"); exit(EXIT_FAILURE); } printf("Verbindung aufgebaut\n"); send(sock,con,strlen(con),0); // printf("Warte auf Nachricht...\n"); r = recv(sock,msg,sizeof(msg)-1,0); // sizeof! msg[r] = '\0'; printf(">>>Empfangen: %s",msg); printf("\nNachricht eingeben...:"); fgets(msg,ARRAY,stdin); send(sock,msg,strlen(msg),0); printf("Gesendet>>> : %s\n",msg); closesocket(sock); WSACleanup(); system("pause"); return 0; } //---------------------------------------------------------------------------
-
Ahhh da hätte ich ewig suchen können, vielen Dank.