Einfaches Netzwerkprogramm



  • Hallo
    Ich kriege eine Fehlermeldung wenn ich folgendes Programm unter Windows kompiliere:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include <windows.h>
    #include <winsock2.h>
    
    const int MAXLINE = 50;
    
    int main ( int argc, char **argv ) {
    	int sockfd, n;
    	char recvline[MAXLINE + 1];
    	struct sockaddr_in servaddr;
    
    	if ( argc != 2 ) {
    		printf ( "usage: a.out <IPaddress>" );
    		exit ( 0 );
    	}
    
    	WSADATA WsaDat;
    	 if (WSAStartup(MAKEWORD(2, 0), &WsaDat) < 0) {
    		printf("initialization error");
    		exit (1);
    	}
    
    	if ( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0) {
    		printf ( "socket error" );
    		exit ( 1 ); 
    	}
    	bzero ( &servaddr, sizeof ( servaddr ) );
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_port = htons ( 13 );
    
    	if ( inet_pton ( AF_INET, argv[1], &servaddr.sin_addr ) <= 0 ) {
    		printf ( "inet_pton error for %s", argv[1] );
    		exit ( 1 ); 
    	}
    
    	if ( connect ( sockfd, (struct sockaddr *) &servaddr, sizeof ( servaddr ) ) < 0 ) {
    		printf ( "connect error" );
    		exit ( 1 ); 
    	}
    	while ( ( n = read ( sockfd, recvline, MAXLINE ) ) > 0 ) {
    		recvline[n] = 0;
    		if ( fputs ( recvline, stdout ) == EOF ) {
    			printf ( "fputs error" );
    			exit ( 1 ); 
    		}
    	}
    	if ( n < 0 ) {
    		printf ( "read error" );
    		exit ( 1 ); 
    	}
    
    	exit ( 0 );
    }
    

    Ich kompiliere mit folgendem Befehl:
    gcc -o client client.c -lws2_32

    Dabei bekomme ich folgende Fehlermeldung:

    C:\Users\Me\AppData\Local\Temp/ccshDqQm.o:client.c:(.text+0x10c): undefined
    reference to _bzero' C:\\Users\\Me\\AppData\\Local\\Temp/ccshDqQm.o:client.c:(.text+0x147): undefined reference to_inet_pton'
    collect2: ld returned 1 exit status

    Es muss wohl irgendwie mit den Linkeroptionen zusammenhängen, aber ich weiß nicht wie ich das lösen kann 😕



  • Weil diese beiden Funktionen vielleicht nicht zu Windows gehören, sondern zu Unix?



  • bzero sollte sowieso nicht mehr verwendet werden, da es im aktuellen POSIX-Standard gar mehr nicht vorhanden ist und davor bereits als LEGACY gekennzeichnet war. memset ist Teil des C90-Standards und somit auch unter Windows verfügbar. Zudem gibt es ja noch andere Wege: struct sockaddr_in servaddr = {0} oder das Makro ZeroMemory ("verstecktes" memset) unter Windows.
    Und inet_pton gibt's erst seit Vista. Dafür musst du nur NTDDI_VERSION bzw. _WIN32_WINNT richtig setzen.



  • Youka schrieb:

    Weil diese beiden Funktionen vielleicht nicht zu Windows gehören, sondern zu Unix?

    OK, was wären denn entsprechende Befehle für Windows?

    EinGast schrieb:

    bzero sollte sowieso nicht mehr verwendet werden, da es im aktuellen POSIX-Standard gar mehr nicht vorhanden ist und davor bereits als LEGACY gekennzeichnet war. memset ist Teil des C90-Standards und somit auch unter Windows verfügbar. Zudem gibt es ja noch andere Wege: struct sockaddr_in servaddr = {0} oder das Makro ZeroMemory ("verstecktes" memset) unter Windows.
    Und inet_pton gibt's erst seit Vista. Dafür musst du nur NTDDI_VERSION bzw. _WIN32_WINNT richtig setzen.

    Danke für die Antwort. Das mit dem struct sockadrr_in serveraddr = {0} funktioniert auch aber das mit dem Setzen dieser Werte hab ich nicht so ganz verstanden. Muss ich vorher was im Präprozessor definieren und ist das unabhängig vom verwendeten Betriebssystem?



  • Probier es doch mal so:

    servaddr.sin_addr.s_addr = inet_addr(argv[1]);
    


  • klöklöklö schrieb:

    Probier es doch mal so:

    servaddr.sin_addr.s_addr = inet_addr(argv[1]);
    

    Hi, ich hab das mal gemacht.
    Das Verbinden klappt nun auch, aber egal mit welchem Server ich mich verbunden habe hat es immmer einen "read error" als Ausgabe des Programms zurückgegeben...



  • Poste den aktuellen Code. Es gibt z.B. auch kein read unter Windows. Du musst recv nehmen!



  • jkljkljkl schrieb:

    Poste den aktuellen Code. Es gibt z.B. auch kein read unter Windows. Du musst recv nehmen!

    Ah mit recv() funktioniert das auch.
    Danke für alle Beiträge, das Programm funktioniert jetzt auch wie es sollte 😉


Anmelden zum Antworten