我想做一个小的ECHO服务器,但这个代码在通过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) ;
答案 0 :(得分:0)
在调用addr_len
之前,您需要将sizeof(sockaddr_in)
设置为recvfrom
- 客户端地址是recevfrom的输出,最后一个参数都是输入和输出 - 输入时它必须是存储客户端地址的缓冲区大小,输出时它由内核设置为地址的实际大小。
您的结果是传递地址值太小的症状,以便在您尝试将其用于sendto