Probleme mit write/send



  • Hallo,
    für mein schönes Studium versuche ich mich etwas in Netzwerkprogrammierung einzuarbeiten.
    Die Serverseite funktioniert vermutlich (ich kann sie per Telnet mit Daten füttern), aber die Clientseite macht mir Ärger:
    Das Programm beendet sich ohne Fehlermeldungen an der Stelle (Zeile 43) wo ich per Send() versuche die Daten zu verschicken. Genau das gleiche passiert, wenn ich alternativ write() verwende.
    Ich hoffe auf eure Hilfe.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    
    int main(){
    
    	int temp, sockel, gesendet;
    	struct sockaddr_in server;
    
    	//Daten fuer Test
    	char daten[1024];
    	sprintf(daten, "Dies ist ein Test\n");
    
    	//Server-Addresse definieren
    	server.sin_family=AF_INET;
    	server.sin_port=htons(1001);
    	server.sin_addr.s_addr=inet_addr("127.0.0.1");
    	memset(&server, 0, sizeof(server));
    
    	printf("Verbindung wird hergestellt...\n");
    
    	//Socket oeffnen fuer TCP/IP
    	sockel=socket(AF_INET, SOCK_STREAM, 0);
    	if (temp<0){
    		perror("Socket-Fehler");
    	}
    	else{
    		printf("Sockel geoeffnet\n");
    	}
    
    	//Zum Server verbinden
    	temp=connect(sockel, (struct sockaddr*)&server, sizeof(struct sockaddr));
    	if (temp<0){
    		perror("Verbindungs-Fehler");
    	}
    	else{
    		printf("Verbunden\n");
    	}
    
    	//Daten Senden
    	gesendet=send(sockel, daten, strlen(daten),0);
    	if (gesendet<0){
    		perror("Sende-Fehler");
    	}
    	else{
    		printf("%i Bytes gesendet\n",gesendet);
    	}
    
    	//Sockel schliessen
    	close(sockel);
    

    Programm läuft unter Suse 10.0 (ja, ja...), compiliert mit gcc.

    Danke schonmal, Simon



  • Fang mal mit errno und strerror(errno) den Fehler ab und schaue, warum send sich da beendet.

    Äh, erst füllst du server und dann setzt du den wieder auf 0 .. warum?

    server.sin_family=AF_INET; 
        server.sin_port=htons(1001); 
        server.sin_addr.s_addr=inet_addr("127.0.0.1"); 
        memset(&server, 0, sizeof(server));
    

    Ich gehe einfach mal davon aus, dass dein Socket wegen dem memset keine Verbindung geöffnet hat und deshalb auch send fehlschlägt.



  • Danke für Deine Antwort! Bevor du editiert hast, habe ich strerr() eingebaut, mein Programm ist nie an die Stelle gekommen, weil er schon beim send() hängen geblieben ist.

    Das mit Memset() habe ich an verschiedenen Stellen gesehen und es deshalb eingebaut (ohne es wirklich zu verstehen). Habe grade nochmal nachgesehen, bei C von A bis Z kommt es VOR den Zuweisungen, also mein Fehler.
    Wenn ich das richtig rate dient es dazu, die Groessen-Differenz von 'sockaddr' und 'sockaddr_in' zu kompensieren?

    Vielen Dank und noch ein Schönes Wochenende!
    Simon



  • Mit memset setzt du einfach nur den gesamten struct auf 0.


Anmelden zum Antworten