2011-12-07 52 views
1

我在同一個進程中使用了兩個套接字,一個充當多播服務器,另一個充當多播客戶端。我試圖將服務器和客戶端功能結合在一個套接字中。直到現在才能成功。是否有人嘗試將單個套接字作爲多播服務器和客戶端來使用。可能嗎?如果沒有任何說明限制的參考將不勝感激。非常感謝。充當多播服務器和客戶端的Linux套接字

回答

0

至少在窗口上是可能的。試試下面的例子(沒有錯誤檢查):

SOCKET the_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

sockaddr_in service; 
service.sin_family = AF_INET; 
service.sin_addr.s_addr = inet_addr("192.168.1.117"); 
service.sin_port = htons(56565); 

int ret = bind(the_socket, (SOCKADDR *) &service, sizeof (service)); 

unsigned int grpaddr = inet_addr("224.4.4.44"); 
unsigned int iaddr = inet_addr("192.168.1.117"); 

//You should have the equivalent function in your existing client 
//to join the multicast group 
ret = join_source_group(the_socket, grpaddr, service.sin_addr.s_addr, iaddr); 

std::string data = "AA"; 

sockaddr_in group; 
group.sin_family = AF_INET; 
group.sin_addr.s_addr = inet_addr("224.4.4.44"); 
group.sin_port = htons(56565); 

ret = sendto(the_socket, data.c_str(), data.length(), 0, (const sockaddr*)&group, sizeof(group)); 

char recvdata[3] = {0}; 
ret = recv(the_socket, recvdata, 3, 0); 

leave_source_group(the_socket, grpaddr, service.sin_addr.s_addr, iaddr); 
+0

謝謝,它的工作。 – Rak

0

「服務器」和「客戶」是不是這確實適合很舒服到非基於連接的插座條款。特別是對於多播。

所以「多播接收器」和「多播發送器」可能更合適。

你當然可以用同一個套接字一次做兩個套接字。加入一個組來發送消息並不是強制性的,但是如果你這麼做了,你可能會收到你自己的消息(在一些操作系統中,這是可選的,例如使用Linux的setsockopt IP_MULTICAST_LOOP實例)。

「服務器」和「客戶端」實際上是在比多播更高層工作的概念。我希望你能解釋你正在努力做得更好,也許在另一個問題上。

多播發送者或接收者是客戶端還是服務器,完全取決於應用程序。

+0

謝謝你的更正。他們有道理。我的意思是在同一個套接字上的多播接收器和發送器功能。 – Rak