Linux套接字充当多播服务器和客户端

时间:2011-12-07 16:58:05

标签: c++ linux

我在同一个进程中使用了两个套接字,一个充当多播服务器,另一个充当多播客户端。我试图在单个套接字中结合服务器和客户端功能。直到现在都无法成功。是否有人尝试将单个套接字作为多播服务器和客户端。可能吗?如果没有任何参考说明限制将不胜感激。非常感谢。

2 个答案:

答案 0 :(得分:0)

至少在Windows上是可能的。请尝试以下示例(不进行错误检查):

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);

答案 1 :(得分:0)

“服务器”和“客户端”不是非常适合非基于连接的套接字的术语。特别是多播。

因此,“多播接收器”和“多播发送器”可能更合适。

当然,您可以使用同一个套接字同时执行这两个操作。加入组以向其发送消息不是强制性的,但是如果这样做,您可能会收到自己的消息(在某​​些操作系统中,这是可选的,对于使用Linux的setsockopt IP_MULTICAST_LOOP的实例)。

“服务器”和“客户端”实际上是在比多播更高层工作的概念。我希望你能解释一下你想要做得更好的事情,也许是另一个问题。

多播发送方或接收方是客户端还是服务器,完全取决于应用程序。