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.

    http://c-worker.ch/tuts.php



  • 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.


Anmelden zum Antworten