我想做一个小的回显服务器,但这段代码在通过sendto时保持返回-1,我不知道为什么。
它总是传递给perror并打印Address family not supported
,有人能解释一下为什么吗?
下面是我的代码:
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) ;
发布于 2018-01-29 15:31:33
在调用recvfrom
之前,需要将addr_len
设置为sizeof(sockaddr_in)
--客户机地址是recevfrom的输出,最后一个参数既是输入又是输出--在输入时,它必须是存储客户机地址的缓冲区的大小,在输出时,内核将它设置为地址的实际大小。
当您尝试将返回的客户端地址用于sendto
时,由于传递的地址值太小而导致返回的客户端地址被截断和无效,因此您的结果可能会出现这种症状
https://stackoverflow.com/questions/48501628
复制相似问题