C++ TShark接收的UDP多播数据包,但不是C/C++;应用程序
总结: TShark显示在特定接口上接收到的多播数据包,但当我连接到该接口的inet/本地IP地址(带有多播地址和端口)时,我不会接收到它们 运行C++ TShark接收的UDP多播数据包,但不是C/C++;应用程序,c++,c,linux,sockets,multicast,C++,C,Linux,Sockets,Multicast,总结: TShark显示在特定接口上接收到的多播数据包,但当我连接到该接口的inet/本地IP地址(带有多播地址和端口)时,我不会接收到它们 运行tshark显示正在接收的多播数据: 230159 27.010051471 206.1.2.3 -> 233.1.2.3 UDP 121 Source port: 5000 Destination port: 6000 ifconfig显示interface\u name的inet地址: inet 172.1.2.3 我设置了多播地址、端口
tshark
显示正在接收的多播数据:
230159 27.010051471 206.1.2.3 -> 233.1.2.3 UDP 121 Source port: 5000 Destination port: 6000
ifconfig
显示interface\u name
的inet地址:
inet 172.1.2.3
我设置了多播地址、端口和本地接口地址,但代码只是阻塞了recvfrom()
我在网上看了三个不同的例子,都试过了,我遇到了同样的问题
从Linux方面看,我们的界面是绑定的(不是这方面的专家,只知道它是绑定的界面)。这是否需要对C/C++进行不同的配置
守则:
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
{
LOG("Error opening datagram socket");
}
int reuse=1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
{
close(sock);
LOG("Error setting SO_REUSEADDR");
}
struct sockaddr_in localSock;
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(6000);
localSock.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (struct sockaddr*)&localSock, sizeof(localSock)))
{
close(sock);
LOG("Error binding datagram socket");
}
struct ip_mreq group;
group.imr_multiaddr.s_addr = inet_addr("233.1.2.3"); // Multicast group address
group.imr_interface.s_addr = inet_addr("172.1.2.3"); // interface local IP
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
{
close(sock);
LOG("Error adding multicast group");
}
LOG("Listening... ");
while (1)
{
socklen_t addrlen = sizeof(localSock);
// The -1 is because a '\0' will be written at the end too
const size_t maxNumBytesToRead = MSGBUFSIZE - 1;
const int nbytes = recvfrom(sock, msgbuf, maxNumBytesToRead, 0, (struct sockaddr *) &localSock, &addrlen);
assert(nbytes > 0);
const HEADER header = *reinterpret_cast<const HEADER*>(&msgbuf[0]);
const uint64_t seqNum = header.getSeqNum();
LOG("Received seqNum: " << seqNum);
}
intsock=socket(AF_INET,sock_DGRAM,0);
if(sock<0)
{
日志(“打开数据报套接字时出错”);
}
int=1;
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)和reuse,sizeof(reuse))<0)
{
关闭(袜子);
日志(“错误设置SO_REUSEADDR”);
}
localSock中的结构sockaddr_;
memset((char*)&localSock,0,sizeof(localSock));
localSock.sin_family=AF_INET;
localSock.sin_port=htons(6000);
localSock.sin\u addr.s\u addr=INADDR\u ANY;
if(绑定(sock,(struct sockaddr*)和localSock,sizeof(localSock)))
{
关闭(袜子);
日志(“绑定数据报套接字时出错”);
}
结构ip_mreq组;
group.imr_multiaddr.s_addr=inet_addr(“233.1.2.3”);//多播组地址
group.imr_interface.s_addr=inet_addr(“172.1.2.3”);//接口本地IP
if(setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)和group,sizeof(group))<0)
{
关闭(袜子);
日志(“添加多播组时出错”);
}
日志(“倾听…”);
而(1)
{
socklen\u t addrlen=sizeof(localSock);
//-1是因为结尾也将写入“\0”
常量大小\u t maxNumBytesToRead=MSGBUFSIZE-1;
const int nbytes=recvfrom(sock、msgbuf、maxNumBytesToRead、0、(struct sockaddr*)、localSock和addrlen);
断言(n字节>0);
const HEADER=*重新解释强制转换(&msgbuf[0]);
const uint64_t seqNum=header.getSeqNum();
日志(“Received seqNum:”评论不用于扩展讨论;此对话已被删除。