[英]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_len
為sizeof(sockaddr_in)
-客戶端地址是recevfrom的輸出,而最后一個參數既是輸入又是輸出-輸入時,它必須是要在其中存儲的緩沖區的大小存儲客戶端地址,並在輸出時由內核將其設置為地址的實際大小。
您的結果表明,傳遞的地址值太小,因此當您嘗試將其用於sendto
時,返回的客戶端地址被截斷且無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.