gpt4 book ai didi

c - sockaddr_in 不支持地址族

转载 作者:行者123 更新时间:2023-11-30 16:36:20 26 4
gpt4 key购买 nike

我想做一个小型的ECHO服务器,但是这段代码在通过sendto时一直返回-1,我不知道为什么。

它总是传递到 perror 并打印地址族不支持谁能解释一下为什么?

这是我的代码:

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

ret = bind(sock, (struct sockaddr *)&serv_addr, sizeof (serv_addr)) ;
// ...
ret = recvfrom (sock, buff, BUFF_SIZE, 0, (struct sockaddr *)&cli_addr, &addr_len ) ;
if (ret < 0)
{
perror ("recvfrom\n") ;
exit (EXIT_FAILURE) ;
}

printf ("%d received :\n\t%s\n", ret, buff) ;
printf ("Sending: \n\t%s\n", buff) ;

addr_len = sizeof (cli_addr) ;
ret = sendto (
sock,
buff,
BUFF_SIZE,
0,
(struct sockaddr *)&cli_addr,
addr_len
) ;
if (ret < 0)
{
perror ("sendto\n") ;
exit (EXIT_FAILURE) ;
}

printf ("%d char sent\n", ret) ;
close (sock) ;

最佳答案

在调用 recvfrom 之前,您需要将 addr_len 设置为 sizeof(sockaddr_in) - 客户端地址为receivefrom 的输出,最后一个参数既是输入又是输出——输入时它必须是存储客户端地址的缓冲区的大小,输出时它由内核设置为实际大小地址。

您的结果表明为地址传递了太小的值,因此当您尝试将其用于 sendto 时,返回的客户端地址会被截断且无效

关于c - sockaddr_in 不支持地址族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48501628/

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