Недопустимый аргумент сокетов BSD при подключении - PullRequest
1 голос
/ 15 июля 2011

Я получаю сообщение об ошибке неверного аргумента при попытке подключить клиента к серверу.Несколько потоков в Интернете сказали, что это может произойти, когда addrlen не прав, но я попытался изменить его на буквальное значение после подсчета длины, и это не сработало.Я также попробовал просто strlen () без удачи.В любом случае, соответствующий код -

сервер -

struct sockaddr name;
int main(int agrc, char** argv) {

    int sock, new_sd, adrlen;   //sock is this socket, new_sd is connection socket

    name.sa_family = AF_INET;
    strcpy(name.sa_data, "127.0.0.1");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);

    //make socket
    sock = socket(AF_INET, SOCK_STREAM, 0);

    if (sock < 0) {
        printf("\nBind error %m", errno);
        exit(1);
    }  

    //unlink and bind
    unlink("127.0.0.1");
    if(bind (sock, &name, adrlen) < 0)
        printf("\nBind error %m", errno);

    //listen
    if(listen(sock, 5) < 0)
        printf("\nListen error %m", errno);

    //accept
    new_sd = accept(sock, &name, (socklen_t*)&adrlen);
    if( new_sd < 0) {
        printf("\nAccept error %m", errno);
        exit(1);
    }

клиент -

int main(int agrc, char** argv) {

    int sock, new_sd, adrlen;

    sock = socket(AF_INET, SOCK_STREAM, 0);

    if (sock < 0) {
        printf("\nserver socket failure %m", errno);
        exit(1);
    }

    //stuff for server socket
    name.sa_family = AF_INET;
    strcpy(name.sa_data, "127.0.0.1");
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family);

    cout<<"\nadrlen: "<<adrlen<<"\n";
    if(connect(sock, &name, adrlen) < 0) {
        printf("\nclient connection failure %m", errno);
        exit(1);
    }

Я не вижу ничего, что может быть не так, но я думаю, я мог бы простобыть пропущенным или неосведомленным о чем-то.Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 15 июля 2011
strcpy(name.sa_data, "127.0.0.1");

В самом деле? Адрес должен быть 32-битным IPv4-адресом, а не строкой.

Это структура для AF_INET (с здесь ):

// IPv4 AF_INET sockets:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};
0 голосов
/ 15 июля 2011

Что ж, ваша большая проблема - совершенно неправильное понимание структуры sockaddr!

Сначала используйте sockaddr_in .

Затем вы должны написать код, подобный следующему:

sockaddr_in sai;
sai.sin_family = AF_INET;
sai.sin_port   = htons( 12345 );  /// Or whatever port you wish to use.
inet_aton("127.0.0.1", &sai.sin_addr.s_addr);

Примечание: htons преобразует короткое значение из хоста в сетевой формат. Хост может быть большим или прямым порядком байтов. Сеть с прямым порядком байтов.

...