2011-12-07 49 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