我在同一个进程中使用了两个套接字,一个充当多播服务器,另一个充当多播客户端。我试图在单个套接字中结合服务器和客户端功能。直到现在都无法成功。是否有人尝试将单个套接字作为多播服务器和客户端。可能吗?如果没有任何参考说明限制将不胜感激。非常感谢。
答案 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的实例)。
“服务器”和“客户端”实际上是在比多播更高层工作的概念。我希望你能解释一下你想要做得更好的事情,也许是另一个问题。
多播发送方或接收方是客户端还是服务器,完全取决于应用程序。