并非本地主机上所有udp发送的数据包都显示在wireshark上 我用C++编写了一个简单的UDP流量生成器,并用Socket作为套接字包装器(),我使用WiReSARK来检查输出。 问题是所有的数据包都是无误发送的,但我没有在wireshark上收到所有的数据包。 示例:我发送了10000个数据包,但Wireshark仅显示9876个数据包。 这是发件人代码: #include <iostream> #include "PracticalSocket.h" #include <thread> using namespace std; const int PAYLOAD_SIZE = 1464; int main(int argc, char *argv[]) { char txBuffer[PAYLOAD_SIZE]; string destAddress = argv[1]; unsigned short destPort = atoi(argv[2]); unsigned long numOfPackets = atoi(argv[3]); UDPSocket tx_sock; unsigned long int i; printf("START\n"); int ret; unsigned long int errors=0; for(i=0;i<numOfPackets;i++) { ret=tx_sock.sendTo(txBuffer, PAYLOAD_SIZE, destAddress, destPort); if(ret<=0) { errors++; printf("ERROR\n"); } } printf("END - packets(%d) errors(%d)\n",i,errors); return i; }

并非本地主机上所有udp发送的数据包都显示在wireshark上 我用C++编写了一个简单的UDP流量生成器,并用Socket作为套接字包装器(),我使用WiReSARK来检查输出。 问题是所有的数据包都是无误发送的,但我没有在wireshark上收到所有的数据包。 示例:我发送了10000个数据包,但Wireshark仅显示9876个数据包。 这是发件人代码: #include <iostream> #include "PracticalSocket.h" #include <thread> using namespace std; const int PAYLOAD_SIZE = 1464; int main(int argc, char *argv[]) { char txBuffer[PAYLOAD_SIZE]; string destAddress = argv[1]; unsigned short destPort = atoi(argv[2]); unsigned long numOfPackets = atoi(argv[3]); UDPSocket tx_sock; unsigned long int i; printf("START\n"); int ret; unsigned long int errors=0; for(i=0;i<numOfPackets;i++) { ret=tx_sock.sendTo(txBuffer, PAYLOAD_SIZE, destAddress, destPort); if(ret<=0) { errors++; printf("ERROR\n"); } } printf("END - packets(%d) errors(%d)\n",i,errors); return i; },c++,sockets,udp,wireshark,C++,Sockets,Udp,Wireshark,从命令行,我将1234作为destPort传递,将10000作为numOfPackets传递。 应用程序没有退出while循环,因此没有打印任何内容。仅当我将较大值的数据包传递给发送方应用程序(即11000)时,它才会返回 然后我还尝试增加两侧的tx和rx缓冲区,但没有效果。为此,我向UDPSocket类添加了一个成员函数: void UDPSocket::setbufferSize(int sndbuf, int rcvbuf) { int s = sndbuf; int r

从命令行,我将1234作为destPort传递,将10000作为numOfPackets传递。 应用程序没有退出while循环,因此没有打印任何内容。仅当我将较大值的数据包传递给发送方应用程序(即11000)时,它才会返回

然后我还尝试增加两侧的tx和rx缓冲区,但没有效果。为此,我向UDPSocket类添加了一个成员函数:

void UDPSocket::setbufferSize(int sndbuf, int rcvbuf) {
    int s = sndbuf;
    int r = rcvbuf;
    setsockopt(sockDesc, SOL_SOCKET, SO_SNDBUF, (raw_type *)&s, sizeof(s));
    setsockopt(sockDesc, SOL_SOCKET, SO_RCVBUF, (raw_type *)&r, sizeof(r));
}

UDP是一种有损协议。允许数据包丢失、无序到达或一个数据包被多次接收。好的,但我向本地主机地址发送了10000个数据包。为什么WS捕获的数据包更少?我试图弄清楚所有的数据包是否真的被发送了。你是如何捕获数据包的?默认情况下,Wireshark通常不会捕获本地主机流量,您必须采取额外的措施来实现这一点,例如安装Microsoft的环回适配器并在其上捕获。这就是您正在做的吗?仅供参考,您显示的代码不应编译,因为
UDPSocket::sendTo()
不返回
int
,它返回
void
。如果发送失败,它会抛出一个
SocketException
。是的,我正在使用环回适配器。我还尝试编写一个简单的接收器来计算rx数据包的数量,但是接收到的数据包的数量小于发送的数据包的数量。我修改了原始的UDPSocket以返回int,而不是抛出异常。
void UDPSocket::setbufferSize(int sndbuf, int rcvbuf) {
    int s = sndbuf;
    int r = rcvbuf;
    setsockopt(sockDesc, SOL_SOCKET, SO_SNDBUF, (raw_type *)&s, sizeof(s));
    setsockopt(sockDesc, SOL_SOCKET, SO_RCVBUF, (raw_type *)&r, sizeof(r));
}