2012-11-19 65 views
1

我目前正在修改Dennis Bush的UFTP(http://uftp-multicast.sourceforge.net)以滿足我的需求。我目前正在嘗試做的是更改客戶端發送COMPLETE消息的地址。我希望修改後的UFTP版本的客戶端能夠多播COMPLETE消息,而不是將其單播回服務器,因爲我需要多播組中的每個客戶端都能夠看到發送的COMPLETE消息,而不僅僅是服務器。errno 97 aka EAFNOSUPPORT又名可能的原因地址族不支持協議

UFTP的作者告訴我,我應該修改client_transfer.c,線359,nb_sendto()函數調用,第5參數到結構包含私有組播地址和端口,而我要發送的完成。不幸的是,我得到了「不受協議支持的地址族」錯誤。該代碼段原本是這樣的:

if (nb_sendto(listener, outpacket, payloadlen, 0, 
       (struct sockaddr *)&group_list[listidx].replyaddr, 
       sizeof(struct sockaddr_in)) == SOCKET_ERROR) { 
     sockerror(group_list[listidx].group_id, group_list[listidx].file_id, 
       "Error sending COMPLETE"); 
    } else { 
     log(group_list[listidx].group_id, group_list[listidx].file_id, 
       "COMPLETE sent"); 
    } 
    set_timeout(listidx); 

    free(buf); 
    free(encrypted); 

我當前的代碼如下所示:

if (nb_sendto(listener, outpacket, payloadlen, 0, 
     ////modified line: 
       (struct in_addr *)&group_list[listidx].multi.s_addr, //struct in_addr multi; 
     ////end of modified line 
       sizeof(struct sockaddr_in)) == SOCKET_ERROR) { 
     sockerror(group_list[listidx].group_id, group_list[listidx].file_id, 
       "Error sending COMPLETE"); 
    } else { 
     log(group_list[listidx].group_id, group_list[listidx].file_id, 
       "COMPLETE sent"); 
    } 
    set_timeout(listidx); 

    free(buf); 
    free(encrypted); 

的錯誤是,對我來說,很模糊。這究竟意味着什麼?造成這種錯誤的可能原因是什麼?有人能指出我正確的方向嗎?

+1

好吧...首先,它看起來像我使用不兼容的類型(in_addr!= sockaddr_in)...無論如何,我想知道更多關於errno 97 – deinocheirus

回答

2

如果你通過的in_addr其中sockaddr預計那麼問題很簡單,當系統調用看它認爲是什麼地址家庭在它認爲是一個sockaddr結構它真的看到其中一個字節你的多播地址,這可能不是一個有效的地址家庭。

爲了解釋多了,sockaddr_in看起來是這樣的:

struct sockaddr_in { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 
} 

所以in_addr面前有一個家庭和端口號,你不提供,而是你的地址的第一個字節被視爲一個地址家庭。

+0

所以我如何從sockaddr投射到sockaddr_in – Stasik

相關問題