sockaddr_in不支持地址族

时间:2018-01-29 12:46:02

标签: c network-programming

我想做一个小的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) ;

1 个答案:

答案 0 :(得分:0)

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

您的结果是传递地址值太小的症状,以便在您尝试将其用于sendto

时,返回的客户端地址会被截断并无效