簡體   English   中英

sockaddr_in不支持地址族

[英]Address family not supported with sockaddr_in

我想做一個小型的ECHO服務器,但是在通過sendto傳遞時,此代碼保持return -1,我不知道為什么。

它總是會變成錯誤,並打印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) ;

您需要調用recvfrom 之前addr_lensizeof(sockaddr_in) -客戶端地址是recevfrom的輸出,而最后一個參數既是輸入又是輸出-輸入時,它必須是要在其中存儲的緩沖區的大小存儲客戶端地址,並在輸出時由內核將其設置為地址的實際大小。

您的結果表明,傳遞的地址值太小,因此當您嘗試將其用於sendto時,返回的客戶端地址被截斷且無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM