我有一个使用pthreads同时发送(广播)和接收UDP数据包的程序。我想要做的是删除我发送的数据包。我怎么做?我的接收代码目前看起来如下:
void *receive_thread_body(void *arg)
{
long msg = 0;
while(msg<500)
{
fd_set socket_set;
FD_ZERO(&socket_set);
FD_SET(b_sock,&socket_set);
struct timeval tm;
tm.tv_usec = 10;
tm.tv_sec = 0;
int ret = select(b_sock+1,&socket_set,0,0,&tm);
if(ret == -1)
{
std::cout<<"select failed";
}
if(FD_ISSET(b_sock,&socket_set) != 0)
{
int recvStringLen = recvfrom(b_sock, &msg, sizeof(msg), 0, NULL, 0);
if(recvStringLen < 0)
{
std::cout<<"recvfrom failed";
}
else
{
printf("\t\t\tRX: %d\n",msg);
}
}
}
}
答案 0 :(得分:2)
您需要填写recvfrom
来电的最后两个参数 - 这将是发件人的地址。
然后将其与您自己的匹配地址列表进行比较(例如,参见here相关信息)。
此方法与发送方式无关 - 您可以在连接或无连接套接字上使用它,当然也可以在广播或多播(或单播)传输上使用它。
答案 1 :(得分:2)
如果您正在谈论多播,请取消设置IP(V6)?_ MULTICAST_LOOP选项(默认情况下可能启用)以不接收您发送的内容。请注意,这将阻止同一主机上的其他应用程序接收您发送的内容。
int zero = 0;
err = setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &zero, sizeof zero);
我没有听说过广播的等价物。但是广播已经很老了,它已被IPv6标准中的多播所取代。