Socket, Problem beim empfangen..



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


Anmelden zum Antworten