linux — C ++ errno 22 получено от bind ()

РЕДАКТИРОВАТЬ Я идиот, проблема была в неуместной скобке, спасибо за помощь, ребята.

Я пытаюсь получить сокет для инициализации, но продолжаю получать errno 22, когда пытаюсь связать сокет. Я прочитал бесчисленные учебные пособия и просмотрел базу данных на сокетах, но я не могу на всю жизнь понять это. Кто-нибудь из вас хочет помочь новичку?

Кажется, моя проблема в этом блоке кода:

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
{
printf("Error binding socket: %d\n", errno);
return 1;
}

Фактической ошибки программы нет, но программа распечатывает, что для errno установлено значение 22, и возвращает 1.

Вот мой код:

#include "Server.h"#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

int serverSock, newSockFd, port;
unsigned int clientAddrLen;

struct sockaddr_in serverAddr, clientAddr;

int Server::ServerStart(short int portno)
{
port = portno;
if(port < 10)
{
printf("Invalid port number\n");
return 1;
}
printf("Port valid, creating new socket\n");

serverSock = socket(AF_INET, SOCK_STREAM, 0);

if(serverSock < 0)
{
printf("Error opening socket: %d\n", errno);
return 1;
}
else
{
printf("Socket open\n");

bzero((char *)(&serverAddr), sizeof(serverAddr));

serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_family = AF_INET;

printf("Binding socket\n");

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
{
printf("Error binding socket: %d\n", errno);
return 1;
}
else
{
printf("Socket bound, listening for new connection\n");

listen(serverSock, 5);

printf("New connection found\n");

clientAddrLen = sizeof(clientAddr);
newSockFd = accept(serverSock, (struct sockaddr*) &clientAddr, &clientAddrLen);
if(newSockFd < 0)
{
printf("Error accepting connection: %d\n", errno);
return 1;
}
else
{
printf("New Socket is: %d\n", newSockFd);
return newSockFd;
}
}
}
}

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

1

Решение

Я полагаю, вы не поставили заключительную скобку.

Вот

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))

Вы передаете sizeof(serverAddr) < 0 (который false поэтому он преобразуется в 0) как последний параметр bind так что, очевидно, не удается.

Так должно быть

if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr)) < 0)
1

Другие решения

Вы пропустили скобки.
Даже если вы закроете круглые скобки и получите ошибку, вероятно, вы передали неверный аргумент sizeof (struct sockaddr).

bind предполагает 3 параметра, а третий параметр имеет тип
Я видел людей, которые прошли значение
sizeof (структура sockaddr *) вместо sizeof (структура sockaddr)

Примечание: третий параметр должен быть целым числом, а не указателем на целое число

0

По вопросам рекламы [email protected]