РЕДАКТИРОВАТЬ Я идиот, проблема была в неуместной скобке, спасибо за помощь, ребята.
Я пытаюсь получить сокет для инициализации, но продолжаю получать 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;
}
}
}
}
Это мой первый пост, поэтому я надеюсь, что я сделал это правильно, пожалуйста, не стесняйтесь указывать на то, что я сделал неправильно или мог бы сделать лучше (даже если это не относится к реальной проблеме, я всегда готов учиться).
Я полагаю, вы не поставили заключительную скобку.
Вот
if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
Вы передаете sizeof(serverAddr) < 0
(который false
поэтому он преобразуется в 0
) как последний параметр bind
так что, очевидно, не удается.
Так должно быть
if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr)) < 0)
Вы пропустили скобки.
Даже если вы закроете круглые скобки и получите ошибку, вероятно, вы передали неверный аргумент sizeof (struct sockaddr).
bind предполагает 3 параметра, а третий параметр имеет тип
Я видел людей, которые прошли значение
sizeof (структура sockaddr *) вместо sizeof (структура sockaddr)
Примечание: третий параметр должен быть целым числом, а не указателем на целое число