2017-01-25 3 views
0

Я пытаюсь сделать связь клиент-сервер с использованием сокетов UNIX и используя протокол STREAM.Ошибка сокета UNIX: операция сокета на не-сокете

Мой сервер работает нормально, но мой клиент не работает. Всякий раз, когда я пытаюсь отправить или получить данные, я получаю сообщение об ошибке: «Работа сокета без него». Я действительно не понимаю, откуда это происходит, потому что мой сервер очень похож, и у меня нет никаких проблем. Мой сервер находится на моем локальном компьютере (127.0.0.1) и на порту 5000. Он открыт и прослушивается (я проверил команду netstat).

Код есть:

#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; 
} 

Что я сделал не так?

EDIT: Ошибка происходит от этой линии:

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

С какой функцией? – o11c

+0

Я отредактировал сообщение, чтобы включить строку ошибки, извините за это – ZamenWolk

+2

Вы используете 'client', где вы должны использовать' sock'. – EJP

ответ

0

вы используете «клиент» переменный в качестве параметра сокета для SENDTO(), когда на самом деле вы должны использовать «носок» переменную

вы должны Трассирование программы, вы можете увидеть следующее:.

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) 

обратите внимание на первый параметр sendto(), который равен 0 (по умолчанию это дескриптор файла stdin), когда на самом деле это должно быть 3 (см. Строку подключения (...))

в качестве примечания стороны Не нужно связывать() клиентский сокет, если у вас нет явной причины сделать это (используя какой-то другой маршрут, чем по умолчанию, в обход правила брандмауэра где-то и т. д.). os по умолчанию назначит ip сетевого интерфейса, по которому проходит маршрут по умолчанию, и случайный свободный порт.

+0

Спасибо! Это была глупая ошибка, которую я вижу ... Я хотел использовать клиент как переменную для сокета, но я что-то испортил. – ZamenWolk

0

В размещенном коде инициализации int client = 0 и я не вижу, что вы его изменить. Поэтому, когда вы вызываете send(0, ...), вы, очевидно, получаете эту ошибку.

Как уже упомянутые @EJP в комментарии на ваш вопрос может быть опечаткой, потому что это выглядит как будто вы на самом деле были предназначены для использования sock (как вы закрепляющие:. connect(sock, ...) вместо client в вызове send

Смежные вопросы