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