gpt4 book ai didi

c - 听(): invalid argument

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

尝试创建服务器-客户端应用程序时,我在设置服务器端连接时遇到了一些麻烦。设置套接字并bind()ing 套接字后,我的listen() 调用失败并显示错误消息

listen: Invalid argument

这是我从 perror() 得到的 - 在 listen() 返回 -1 的情况下。

程序的概要如下:我使用 getaddrinfo() 生成一个 struct addrinfo 的链表,循环遍历直到找到一个我可以成功地创建一个套接字,然后是 bind(),最后是 listen()

listen() 调用如下:

if ((status = listen(socket_fd, BACKLOG_SIZE)) == -1) {
perror("listen");
close(socket_fd);
freeaddrinfo(res);
exit(EXIT_FAILURE);
}

可以肯定的是,我打印了 socket_fdBACKLOG_SIZE 的值,结果是 35,分别。现在已经调试了几个小时,我根本找不到问题所在。也没有在 stackOverflow 上发现任何人有同样的问题......

提前感谢您的帮助!

完整程序:

int main(int argc, char* argv[]) {
int port_no = server_usage(argc, argv);
ready_connection(port_no);

/* Synopsis:
getaddrinfo()
socket()
bind()
listen()
accept()
*/
int socket_fd = setup_socket(NULL, port_no);

struct sockaddr_storage their_addr;
socklen_t addr_size = sizeof(their_addr);
int new_fd = 0;

// Allow reuse of sockets
int activate=1;
setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &activate, sizeof(int));

if ((status = bind(socket_fd, res->ai_addr, res->ai_addrlen)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}

if ((status = connect(socket_fd, res->ai_addr, res->ai_addrlen)) == -1) {
perror("connect");
close(socket_fd);
freeaddrinfo(res); // free the linked-list
exit(EXIT_FAILURE);
}

if ((status = listen(socket_fd, BACKLOG_SIZE)) == -1) {
perror("listen");
close(socket_fd);
freeaddrinfo(res); // free the linked-list
exit(EXIT_FAILURE);
}

if ((new_fd == accept(socket_fd, (struct sockaddr *)&their_addr, &addr_size)) == -1) {
perror("accept");
exit(EXIT_FAILURE);
}

char buffer[BUFSIZE];
recv(new_fd, buffer, BUFSIZE, 0);

close(socket_fd);
close(new_fd);
freeaddrinfo(res); // free the linked-list

return 0;
}

setup_socket()-函数:

int setup_socket(char* hostname, int port_no) {
// hints is mask struct, p is loop variable
struct addrinfo hints, *p;

memset(&hints, 0, sizeof hints); // make sure the struct is empty
// TODO IPv6-support?
hints.ai_family = AF_INET; // only IPv4 supported
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
hints.ai_flags = AI_PASSIVE; // fill in my IP for me

char port_str[6]; // max port size is 5 digits + 0-byte
memset(port_str, 0, 6);
sprintf(port_str, "%d", port_no);

if ((status = getaddrinfo(hostname, port_str, &hints, &res)) == -1) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(EXIT_FAILURE);
}

int socket_fd = 0;

for (p = res; p != NULL; p = p->ai_next) {
if ((socket_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
}

if (socket_fd == 0) {
errno = ENOTSOCK;
perror("no socket");
exit(EXIT_FAILURE);
}

return socket_fd;
}

最佳答案

您不能在同一个套接字上先连接(),然后再监听()。丢失 connect()。

关于c - 听(): invalid argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33845491/

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