gpt4 book ai didi

c - socket bind() 返回错误 EINVAL

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:21 26 4
gpt4 key购买 nike

我正在尝试绑定(bind)服务器套接字,以便我可以接收和监听来自其他客户端的传入消息。但我无法绑定(bind),它返回错误 - EINVAL(无效参数)。我已经完成了之前提出的与此错误相关的问题,Linux 手册页说“套接字已经绑定(bind)到一个地址,并且该协议(protocol)不支持绑定(bind)到新地址;或套接字已关闭。'

这是 c 中有问题的服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>

#define LISTEN_BACKLOG 5

#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while(0)

int main(int argc, char* argv[])
{
int sockfd, cfd;
struct sockaddr_in myaddr, cl_addr;
socklen_t cl_len;
int quit = 0, reuse = 1;

if (argc < 2)
{
fprintf(stderr, "ERROR, no port provided\n");
exit(1);
}

if ((sockfd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)
handle_error("socket");

printf("socket created.\n");

#ifdef SO_REUSEADDR
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
perror("setsockopt(SO_REUSEADDR) failed");
#endif

#ifdef SO_REUSEPORT
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
perror("setsockopt(SO_REUSEPORT) failed");
#endif

memset(&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(atoi(argv[1]));

printf("portno: %d\n", atoi(argv[1]));

if (bind(sockfd, (struct sockaddr *) &myaddr, sizeof(myaddr)) < 0)
handle_error("bind");
printf("bind successful\n");

close(sockfd);
unlink((const char *) &myaddr);

return 0;
}

当我尝试启动服务器时,出现错误 EINVAL,如下所示:

$./服务器 8032

已创建套接字。

端口号:8032

绑定(bind):无效参数

将很高兴收到任何关于此的意见,谢谢!

最佳答案

问题在于您创建套接字的方式。

 if ((sockfd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1)

在这里,您正在为 PF_LOCAL 创建套接字,而不是为 AF_INET 系列创建套接字。

关于c - socket bind() 返回错误 EINVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32879411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com