从 bind() 收到的 C++ errno 22
C++ errno 22 received from bind()
编辑我是个白痴,问题是括号放错了谢谢大家的帮助。
我正在尝试初始化一个套接字,但是当我尝试绑定套接字时,我一直收到 errno 22。我已经阅读了无数教程并在套接字上搜索了数据库,但我无法终生解决这个问题。有哪位亲愿意帮助新手吗?
我的问题似乎出在这段代码中:
if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
{
printf("Error binding socket: %d\n", errno);
return 1;
}
没有实际的程序错误,但程序打印出 errno 设置为 22 和 returns 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;
}
}
}
}
这是我的第一个post所以我希望我做对了,请随时指出我做错的或可以做得更好的地方(即使它与实际问题无关,我我总是愿意学习)。
我相信你放错了右括号。
这里
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 (struct sockaddr *) 而不是 sizeof( struct sockaddr)
注意:第三个参数应该是整数,而不是指向整数的指针
编辑我是个白痴,问题是括号放错了谢谢大家的帮助。
我正在尝试初始化一个套接字,但是当我尝试绑定套接字时,我一直收到 errno 22。我已经阅读了无数教程并在套接字上搜索了数据库,但我无法终生解决这个问题。有哪位亲愿意帮助新手吗?
我的问题似乎出在这段代码中:
if(bind(serverSock, (struct sockaddr*)(&serverAddr), sizeof(serverAddr) < 0))
{
printf("Error binding socket: %d\n", errno);
return 1;
}
没有实际的程序错误,但程序打印出 errno 设置为 22 和 returns 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;
}
}
}
}
这是我的第一个post所以我希望我做对了,请随时指出我做错的或可以做得更好的地方(即使它与实际问题无关,我我总是愿意学习)。
我相信你放错了右括号。
这里
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 (struct sockaddr *) 而不是 sizeof( struct sockaddr)
注意:第三个参数应该是整数,而不是指向整数的指针