Socket, Problem beim empfangen..



  • Guten Abend..
    Dieser hier, war mein erster Versuch ein Socketserver zu programmieren,
    ich habe versucht von meinem anderen Computer aus Wörter zu senden..
    Ich schaffe es eine Verbindung herzustellen, aber das Empfangen funktioniert nicht..
    Ich stelle die Verbindung her, schicke Datensätze und dann drücke ich a um den Datensatz der in empf reinkommen soll auszugeben..
    Wenn ich a drücke, gibt er entweder nichts aus, oder einfach nur ein M bzw. , irgendwas irrelevantes..
    Wenn mir jemand bei meinen Problem helfen könnte, wäre ich Ihn sehr dankbar.
    Grüße
    Sockss

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<netdb.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    int main() {
    char empf[1000];
    int rr; //Variable fuer Rueckgabe-Wert von recv()
    int ar; //Variable fuer Rueckgabe-Wert von accept()
    int lr; // Variable fuer Rueckgabe Wert von listen()
    int sr; // Variable fuer Rueckgabe-Wert von socket()
    int br; //Variable fuer Rueckgabe-Wert von bind()
    struct sockaddr_in var;
    var.sin_family=AF_INET; // Protokoll
    var.sin_addr.s_addr = htonl(INADDR_ANY); //Welche IP-Adresse reinkommen duerfen
    var.sin_port = htons(80); // unter welchen Port
    sr = socket(AF_INET,SOCK_STREAM,0); // Erstellen des Sockets
    if(sr == -1) {
    printf("Fehler beim Socket-Erstellen!");    // ueberprueft
    exit(1);  }                              // ob ein Socket erstellt werden konnte */
    br = bind(sr,(struct sockaddr*)&var,sizeof(var)); //Freigeben des Portes
    if(br==-1) { printf("Fehler beim Freigeben des Portes."); //ueberpruefen ob Port freigegeben werden konnte
    exit(1);
    }
    lr=listen(sr,1);//wieviel Verbindungsanfragen gemacht werden duerfen
    if(lr==-1) { printf("listen() hat nicht funktioniert!");
    exit(1);
    }
    struct sockaddr_in cl;
    socklen_t len;
    int i;
    for(;;) {
    len=sizeof(cl);
    ar=accept(sr,(struct sockaddr*)&cl,&len);
    if(ar==-1) { printf("Fehler beim akzeptieren der Verbimndung.");
    exit(1); }
    if(getchar()=='a') { break; }
    rr = recv(sr,empf,1000,0);
    }
    printf("%s",empf);
    }
    


  • Nichtssagende Variablennamen
    Keine Einrückung

    Da ist es Schwierig irgendetwas zu überblicken.

    Aber eins ist mir doch aufgefallen.
    %s bei printf erwrtet einen Nullterminierten Strng.
    recv speichert aber nur das ab, was auch gesendet wird.
    Meist wird die '\0' aber nicht mitgesendet, also musst du dafür sorgen, das sie angehängt wird.

    Sonst kann ich dir noch http://www.zotteljedi.de/socket-tipps/index.html empfehlen.



  • DirkB schrieb:

    Nichtssagende Variablennamen
    Keine Einrückung

    Da ist es Schwierig irgendetwas zu überblicken.

    Aber eins ist mir doch aufgefallen.
    %s bei printf erwrtet einen Nullterminierten Strng.
    recv speichert aber nur das ab, was auch gesendet wird.
    Meist wird die '\0' aber nicht mitgesendet, also musst du dafür sorgen, das sie angehängt wird.

    Sonst kann ich dir noch http://www.zotteljedi.de/socket-tipps/index.html empfehlen.

    Danke erstmal.
    Tut mir leid, werde nächstes mal darauf achten!
    Werde mal schauen, danke.



  • Was ist denn der Client für dein Programm?
    Wie testest du die Verbindung?



  • Ein Computer mit Windows, und der schickt mit einem Programm an meine IP-Adresse und den Port(80), Wörter..



  • Wenn du mit Sockets programmierst, kann ich das Tool netcat empfehlen.
    Sollte bei Linux schon mit dabei sein. (Aufruf evtl. auch über nc )

    Damit kann man in der Konsole sehr einfach Netzwerkverbindungen aufbauen.
    Man kann das Programm auch als Server starten.



  • Danke fuer den Tipp, aber das Problem ist damit leider immer noch nicht gelöst.



  • Warum speicherst du alle Rückgabewerte in Variablen
    und warum ist dein Code so schrecklich unübersichtlich !!!

    Achja perror() ist dein Freund und kann dir sehr behilflich sein benutz es



  • Ich glaube, ich würde den Port 80 nicht nutzen, wenn man nicht muss.

    -> http://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports

    Augenscheinlich klappt die Verbindung, aber der Rest, sprich das Lesen eines Strings, da hast Du wohl ein Problem.

    Du machst eine For-Schleife, die Du mit Exit verläßt oder garnicht.
    In der Schleife wartest Du mit getchar, was wohl zu Deiner Ausgabe führt, nicht das printf (welches nie erreicht wird).

    Eine Verbindung musst Du nur einmal akzeptieren, nicht in einer Schleife immer wieder. Willst Du viele Verbindungen, solltest Du auch öfters mal hinhören...

    Es wäre gut, wenn Du das Programm nebst Deinem Client in einer lesbaren Form nochmal einstellst, weil so macht das mal keinen Spaß...

    Ciao MM



  • Dankeschön erstmal, werde es nochmal überarbeiten und dann nochmal reinstellen!



  • #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<netdb.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    int main() {
    	char empf[4000];
    	int ruckgabe_recv; //Variable fuer Rueckgabe-Wert von recv()
    	int ruckgabe_accept; //Variable fuer Rueckgabe-Wert von accept()
    	int ruckgabe_listen; // Variable fuer Rueckgabe Wert von listen()
    	int ruckgabe_socket; // Variable fuer Rueckgabe-Wert von socket()
    	int ruckgabe_bind; //Variable fuer Rueckgabe-Wert von bind()
    	struct sockaddr_in var;
    	var.sin_family=AF_INET; // Protokoll
    	var.sin_addr.s_addr = htonl(INADDR_ANY); //Welche IP-Adresse reinkommen duerfen
    	var.sin_port = htons(8080); // unter welchen Port
    	ruckgabe_socket = socket(AF_INET,SOCK_STREAM,0); // Erstellen des Sockets
    	if(ruckgabe_socket == -1) {
    		printf("Fehler beim Socket-Erstellen!");    // ueberprueft
    		exit(1);  }                              // ob ein Socket erstellt werden konnte */
    	ruckgabe_bind = bind(ruckgabe_socket,(struct sockaddr*)&var,sizeof(var)); //Freigeben des Portes
    	if(ruckgabe_bind ==-1) { 
    		printf("Fehler beim Freigeben des Portes."); //ueberpruefen ob Port freigegeben werden konnte
    		exit(1);
    }
    	ruckgabe_listen=listen(ruckgabe_socket,1);//wieviel Verbindungsanfragen gemacht werden duerfen
    	if(ruckgabe_listen==-1) { 
    		perror("listen()");
    		exit(1);
    }
    	struct sockaddr_in cl;
    	socklen_t len;
    	int i;
    	len=sizeof(cl);
    	ruckgabe_accept=accept(ruckgabe_socket,(struct sockaddr*)&cl,&len);
    	if(ruckgabe_accept==-1) {
    			perror("accept()");
    			exit(1);  }
    	for(;;) {
    		printf("%s",empf);
    		ruckgabe_recv = recv(ruckgabe_accept,empf,4000,0);
    }
    
    }
    

    Ich hoffe jetzt ist es besser, werde es gleich mal ausprobieren.



  • #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<netdb.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    int main() {
    	char empf[4000];
    	int ruckgabe_recv; //Variable fuer Rueckgabe-Wert von recv()
    	int ruckgabe_accept; //Variable fuer Rueckgabe-Wert von accept()
    	int ruckgabe_listen; // Variable fuer Rueckgabe Wert von listen()
    	int ruckgabe_socket; // Variable fuer Rueckgabe-Wert von socket()
    	int ruckgabe_bind; //Variable fuer Rueckgabe-Wert von bind()
    	struct sockaddr_in var;
    	var.sin_family=AF_INET; // Protokoll
    	var.sin_addr.s_addr = htonl(INADDR_ANY); //Welche IP-Adresse reinkommen duerfen
    	var.sin_port = htons(8080); // unter welchen Port
    	ruckgabe_socket = socket(AF_INET,SOCK_STREAM,0); // Erstellen des Sockets
    	if(ruckgabe_socket == -1) {
    		printf("Fehler beim Socket-Erstellen!");    // ueberprueft
    		exit(1);  }                              // ob ein Socket erstellt werden konnte */
    	ruckgabe_bind = bind(ruckgabe_socket,(struct sockaddr*)&var,sizeof(var)); //Freigeben des Portes
    	if(ruckgabe_bind ==-1) { 
    		printf("Fehler beim Freigeben des Portes."); //ueberpruefen ob Port freigegeben werden konnte
    		exit(1);
    }
    	ruckgabe_listen=listen(ruckgabe_socket,1);//wieviel Verbindungsanfragen gemacht werden duerfen
    	if(ruckgabe_listen==-1) { 
    		perror("listen()");
    		exit(1);
    }
    	struct sockaddr_in cl;
    	socklen_t len;
    	int i;
    	len=sizeof(cl);
    	ruckgabe_accept=accept(ruckgabe_socket,(struct sockaddr*)&cl,&len);
    	if(ruckgabe_accept==-1) {
    			perror("accept()");
    			exit(1);  }
    	for(;;) {
    		ruckgabe_recv = recv(ruckgabe_accept,empf,4000,0);
    		empf[3999] = '\0';
    		printf("%s",empf);
    }
    
    }
    


  • Läuft es denn jetzt?

    for(;;) {
            ruckgabe_recv = recv(ruckgabe_accept,empf,3999,0);
            if (ruckgabe_recv > 0) {
              empf[ruckgabe_recv] = '\0';
              printf("%s",empf);
            } else {
    // der socket wurde geschlossen
    Fehlerbehandlung oder exit
            }
      }
    

    Deine } sind noch falsch eingerückt.



  • Wenns noch immer nicht läuft hier ein Beispiel von mir:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #define SERVER
    int main(void) 
    {
    	int sockfd;
    	struct sockaddr_in adresse;
    	adresse.sin_family = AF_INET;
    	adresse.sin_addr.s_addr = htonl(INADDR_ANY);
    	adresse.sin_port = htons(8080);
    
    	sockfd = socket(AF_INET, SOCK_STREAM, 0);	/* erstelle stream socket */
    	if(sockfd == -1) {
    		perror("Fehler bei socket()");
    		exit(EXIT_FAILURE);
    	}
    	#ifdef SERVER
    	/*binde socket an adresse */
    	if( bind(sockfd, (struct sockaddr*) &adresse, sizeof(adresse)) == -1) {
    		perror("bind fehlgeschlagen");
    		exit(EXIT_FAILURE);
    	}
    	/* Bereite auf Verbindungsanforderung vor */
    	if( listen(sockfd, 4) == -1 ) {
    		perror("Fehler bei listen()");
    		exit(EXIT_FAILURE);
    	}
    	while(1) {
    		int connection = accept(sockfd, NULL, NULL); /*gibt neuen descriptor zurück ,
    		                                               der mit dem client verbunden ist*/
    		if(connection == -1) {
    			perror("Verbindungs Fehler");
    		} else {
    			char puffer[16];
    			ssize_t length = read(connection, puffer, sizeof puffer);
    			while(length > 0) {
    				if(write(STDOUT_FILENO, puffer, length) == -1) {
    					perror("write() in stdout");
    					break;
    				}
    				length = read(connection, puffer, sizeof puffer);
    			}
    			if(length == -1) {
    				perror("read()");
    			}
    			(void)write(STDOUT_FILENO, "\n", 1);
    			close(connection);
    		}
    	}
    	#else /*client*/
    	/* Verbindung mit Server herstellen*/
    	if(connect(sockfd, (struct sockaddr*) &adresse, sizeof(adresse)) == -1) {
    		perror("Verbindung konnte nicht hergestellt werden");
    		exit(EXIT_FAILURE);
    	}
    	/*Eine Nachricht senden*/
    	{
    	 	char nachricht[128];
    	 	printf("Sende: ");
    	 	scanf("%127s", nachricht);
    	 	if( write(sockfd, nachricht, strlen(nachricht)) == -1 ) 
    	 		perror("Senden fehlgeschlagen");
    	 	else 
    	 		puts("gesendet");
    	 	close(sockfd);
    	}
    	#endif
    	return EXIT_SUCCESS;
    }
    


  • Nicht wirklich, ich sende was, und auf der Konsole passiert nichts..



  • bei gary115 funktioniert es.. Was ist bei ihm anders?


Log in to reply