2017-01-25 4 views
0

Ich versuche, eine Client-Server-Kommunikation mit UNIX-Sockets und mit dem STREAM-Protokoll.UNIX-Socket-Fehler: Socket-Operation auf Nicht-Socket

Mein Server läuft gut, aber mein Client funktioniert nicht. Immer wenn ich versuche, Daten zu senden oder zu empfangen, erhalte ich einen Fehler: "Socket-Operation auf Nicht-Socket". Ich sehe wirklich nicht wo es herkommt, weil mein Server sehr ähnlich ist und ich kein Problem habe. Mein Server befindet sich auf meinem lokalen Computer (127.0.0.1) und Port 5000. Er ist offen und hört zu (ich habe das mit dem Befehl netstat überprüft).

Der Code ist es:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <errno.h> 

#define CHECK(ret, mes) if ((ret) == -1) {perror(mes); exit(-1);} 

#define STRING_LENGTH 250 

int createSocketINETClient(short mode, char *addr, short port) 
{ 
    int s; 
    struct sockaddr_in moi, server; 
    int moi_len, server_len; 

    moi.sin_family = AF_INET; 
    moi.sin_port = htons(port); 
    moi.sin_addr.s_addr = inet_addr(addr); 

    memset(moi.sin_zero, 0, 8); 

    s = socket(AF_INET, mode, 0); 

    CHECK(s, "socket"); 

    moi_len = sizeof(moi); 

    CHECK(bind(s, (struct sockaddr*) &moi, moi_len), "bind"); 

    return s; 
} 

void infoSocket (int s) 
{ 
    struct sockaddr_in sock_addr; 
    socklen_t len = sizeof(sock_addr); 

    getsockname(s, (struct sockaddr*) &sock_addr, &len); 

    printf("Onfo of socket %d\n", s); 
    printf("\t IP : %s\n", inet_ntoa(sock_addr.sin_addr)); 
    printf("\t port : %d\n\n", ntohs(sock_addr.sin_port)); 
} 

int main() 
{ 
    int bytes; 
    int sock = createSocketINETClient(SOCK_STREAM, "0.0.0.0", 0); 
    struct sockaddr_in serveurSock; 
    int client = 0, clientSockLen = 0; 
    char message[] = "I am a message that is supposed to WORK !!!!\n"; 
    char fromServer[STRING_LENGTH] = ""; 
    infoSocket(sock); 


    serveurSock.sin_family = AF_INET; 
    serveurSock.sin_port = htons(5000); 
    serveurSock.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    memset(serveurSock.sin_zero, 0, 8); 

    CHECK(connect(sock, (struct sockaddr*) &serveurSock, sizeof(serveurSock)), "connect"); 

    usleep(1000000); 

    CHECK((bytes = send(client, message, sizeof(message), 0)), "send"); 
    printf("Message sent to server : %d bytes, \"%s\"\n", bytes, message); 

    CHECK((bytes = recv(client, fromServer, sizeof(fromServer), 0)), "recv"); 
    printf("Message received from server : %d bytes, \"%s\"\n", bytes, fromServer); 

    close(client); 
    printf("Client released !\n\n"); 

    return 0; 
} 

Was habe ich falsch gemacht?

EDIT: Der Fehler von dieser Linie kommt:

CHECK((bytes = send(client, message, sizeof(message), 0)), "send"); 
+0

Aus welcher Funktion? – o11c

+0

Ich habe den Beitrag bearbeitet, um die Zeile des Fehlers einzuschließen, sorry dafür – ZamenWolk

+2

Sie verwenden 'client', wo Sie' sock' verwenden sollten. – EJP

Antwort

0

Sie werden mit dem „Client“ Variable als Socket-Parameter auf SENDTO(), wenn in der Tat sollten Sie die „Socke“ Variable verwenden

sollten Sie das Programm strace Sie folgendes sehen konnte.

connect(3, {sa_family=AF_INET, sin_port=htons(5000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 
nanosleep({tv_sec=1, tv_nsec=0}, NULL) = 0 
sendto(0, "I am a message that is supposed "..., 46, 0, NULL, 0) = -1 ENOTSOCK (Socket operation on non-socket) 

Beachten Sie den ersten sendto() - Parameter, der 0 ist (standardmäßig ist dies der stdin-Datei-Deskriptor), wenn es tatsächlich 3 sein sollte (siehe connect (...) Zeile)

als eine Randnotiz, Sie don Sie müssen den Client-Socket nur dann binden(), wenn Sie einen expliziten Grund dafür haben (indem Sie eine andere Route als die Standardroute verwenden, eine Firewall-Regel irgendwo umgehen usw.). Das Betriebssystem wird standardmäßig die IP der Netzwerkschnittstelle zuweisen, die die Standardroute durchläuft, und einen zufälligen freien Port.

+0

Danke! Es war ein blöder Fehler, den ich sehe ... ich wollte Client als Variable für den Socket verwenden, aber ich habe es irgendwo vermasselt. – ZamenWolk

0

In den entsandten Code initialisieren Sie int client = 0 und dann sehe ich nicht Sie es ändern. Also, wenn Sie send(0, ...) anrufen, erhalten Sie offensichtlich diesen Fehler.

Wie bereits von @EJP in Kommentar zu Ihrer Frage erwähnt, kann es ein Tippfehler sein, denn es sieht aus wie Sie wirklich sock verwenden sollte (wie Sie angeschlossen es. connect(sock, ...) statt client im Aufruf von send

Verwandte Themen