socket operation on on-socket obwohl socket(..) erfolgreich war



  • Hallo,

    ich habe ein merkwürdiges Problem.
    wenn ich einen Thread mit dieser Funktion starte:

    static void* listeningThread(void *arg) {
    	char* msg = (char*)arg;
    	int sock, concrsock;
    	struct sockaddr_in addr;
    	char* buffer = malloc(BUFFERSIZE);
    	const int y = 1;
    	int retval;
    	socklen_t addrlen;
    
    	//printf("%s\n", **msg);
    
    	printf("Start des ListeningThreads\n");
    
    	if(sock = socket(AF_INET, SOCK_STREAM, 0) > 0) {
    		printf("Socket zum Empfangen erfolgreich angelegt\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    		//printf("%d\n",sock1);
    	}
    
    	if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int)) != 0) {
    		printf("setsockopt schlug fehl\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    	}
    
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(17000);
    	addr.sin_addr.s_addr = INADDR_ANY;
    
    	if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
    		printf("Port kann nicht belegt werden\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    
    	}
    
    	if( (retval = listen(sock, 10)) == 0) {
    		printf("Listen erfolgreich\n");
    	}
    	addrlen = sizeof(struct sockaddr_in);
    
    	while(1) {
    		//printf("ist am warten....\n");
    		if( (concrsock = accept(sock, (struct sockaddr*)&addr, &addrlen)) > 0)
    			printf("Erfolgreich einen Klienten verbunden\n");
    		//printf("warten vorbei....\n");
    		buffer = "Ich lebe\0";
    		send(concrsock, buffer, strlen(buffer), 0);
    
    	}
    
    	printf("Listening zu Ende");
    
    }
    

    erhalte ich folgende Ausgabe:

    Start des ListeningThreads
    Socket zum Empfangen erfolgreich angelegt
    Success
    setsockopt schlug fehl
    Socket operation on non-socket
    Port kann nicht belegt werden
    Socket operation on non-socket
    

    Wodran kann das liegen. der Aufruf von socket() hat doch funktioniert?

    danke für eure hilfe

    mfg naja



  • oh man.

    was für ein dummer fehler.

    hab die klammerung im if vergessen.....

    mfg naja



  • hi,
    bei mir läuft der Code. Es war tatsächlich die Klammer bei der if-Anweisung. Wenn du den gcc verwendest benutze doch die Option -Wall. Dann bekommst du alle Warnungen angezeigt - so hättest du dein Fehler gleich gemerkt.

    mfg blan



  • hi,

    hab ab dann auch die -Wall option benutzt :-).

    Aber ich hab noch ein kleines Problemchen:

    Das gesamte Programm: (ignoriert mal, dass der sendingThread noch nicht ganz vollständig ist)

    /*
     * router.c
     *
     *  Created on: 20.06.2010
     *      Author: andreas
     */
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <pthread.h>
    #include <errno.h>
    #include <semaphore.h>
    #define BUFFERSIZE 1024
    
    sem_t sem;
    
    static void* listeningThread(void *arg) {
    	int sock, concrsock;
    	struct sockaddr_in addr;
    	char* buffer = malloc(BUFFERSIZE);
    	const int y = 1;
    	int retval;
    	socklen_t addrlen;
    
    	printf("Start des ListeningThreads\n");
    
    	if( (sock = socket(AF_INET, SOCK_STREAM, 0)) > 0) {
    		printf("Socket zum Empfangen erfolgreich angelegt\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    		//printf("%d\n",sock1);
    	}
    
    	if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int)) != 0) {
    		printf("setsockopt schlug fehl\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    	}
    
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(17000);
    	addr.sin_addr.s_addr = INADDR_ANY;
    
    	if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
    		printf("Port kann nicht belegt werden\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    	}
    
    	if( (listen(sock, 10)) != 0) {
    		printf("Listen nicht erfolgreich\n");
    		fprintf(stderr, "%s\n", strerror(errno));
    	}
    	addrlen = sizeof(struct sockaddr_in);
    
    	while(1) {
    		printf("ist am warten....\n");
    		sem_post(&sem);
    		concrsock = accept(sock, (struct sockaddr*)&addr, &addrlen);
    		if( concrsock > 0) {
    			printf("Es ist ein Klient (%s) verbunden...\n", inet_ntoa(addr.sin_addr));
    		}
    
    		printf("%d\n", concrsock);
    		printf("warten vorbei....\n");
    
    		buffer = "Ich lebe\0";
    		retval = send(concrsock, buffer, strlen(buffer), 0);
    		printf("Erfolgreich %d Bytes gesendet\n", retval);
    		/*fprintf(stderr, "%s\n", strerror(errno));*/
    
    		do {
    
    			retval = recv(concrsock, buffer, BUFFERSIZE-1, 0);
    			printf("Erfolgreich %d Bytes empfangen\n", retval);
    			fprintf(stderr, "%s\n", strerror(errno));
    			exit(EXIT_FAILURE);
    			printf("%s\n", buffer);
    
    		} while(strcmp(buffer, "complete"));
    		close(concrsock);
    
    	}
    
    	printf("Listening zu Ende");
    
    }
    
    static void* sendingThread(void* arg) {
    	sem_wait(&sem);
    	sem_post(&sem);
    	int sendingSocket;
    	char* buffer1 = malloc(BUFFERSIZE);
    	struct sockaddr_in address;
    	char* adr = "192.168.1.101\0";
    	char temp[255];
    	int retval;
    
    	printf("Start des Sending Threads\n");
    
    	if( (sendingSocket = socket(AF_INET, SOCK_STREAM,0)) > 0) {
    		printf("Socket zum Senden erfolgreich angelegt\n");
    	}
    
    	address.sin_family = AF_INET;
    	address.sin_port = htons(17000);
    	inet_aton(adr, &address.sin_addr);
    
    	printf("Verbinden?\n");
    	fgets(temp, 254, stdin);
    	if(connect(sendingSocket, (struct sockaddr*)&address, sizeof(address)) == 0) {
    		printf("Erfolgreich verbunden\n");
    	}
    
    	retval = recv(sendingSocket, buffer1, BUFFERSIZE-1, 0);
    	printf("Erfolgreich %d empfangen\n",retval);
    	printf("%s\n", buffer1);
    
    	buffer1 = "complete achja \0";
    	retval = send(sendingSocket, buffer1, strlen(buffer1), 0);
    	printf("Erolgreich %d Bytes gesendet\n",retval);
    
    }
    
    int main(void) {
    
    	pthread_t listeningID;
    	pthread_t sendingID;
    	char* dummy;
    	int** ret;
    	dummy = "Achja, du schon wieder\0";
    	sem_init(&sem, 0, 1);
    
    	sem_wait(&sem);
    	pthread_create(&listeningID, NULL, listeningThread, (void*)dummy);
    	pthread_create(&sendingID, NULL, sendingThread, (void*)dummy);
    	pthread_join(listeningID, (void**)ret);
    
    	exit(EXIT_SUCCESS);
    }
    

    gibt auf der Seite die senden will folgende Ausgabe:

    Start des ListeningThreads
    Socket zum Empfangen erfolgreich angelegt
    Success
    ist am warten....
    Start des Sending Threads
    Socket zum Senden erfolgreich angelegt
    Verbinden?
    y
    Erfolgreich verbunden
    Erfolgreich 8 empfangen
    Ich lebe
    Erolgreich 15 Bytes gesendet
    

    Und auf der Seite die empfängt folgende Ausgabe:

    Start des ListeningThreads
    Socket zum Empfangen erfolgreich angelegt
    Success
    ist am warten....
    Start des Sending Threads
    Socket zum Senden erfolgreich angelegt
    Verbinden?
    Es ist ein Klient (192.168.1.102) verbunden...
    5
    warten vorbei....
    Erfolgreich 8 Bytes gesendet
    Success
    Erfolgreich -1 Bytes empfangen
    Bad address
    

    Aber wieso schlägt recv hier fehl?

    Die Adresse ist doch richtig?

    mfg naja


Log in to reply