我有在Qt中测试udp套接字的应用程序。这真的很简单。一个套接字绑定到端口并侦听传入的数据包。其他套接字用于发送数据包。包裹中的第一个数字是发送者发送的包裹,后续数据仅用于测试。当接收方收到包时,它会显示接收/发送速率。你可以改变包的大小和定时器发送包的超时时间。我有两台位于两台不同路由器后面的计算机,我是这样测试的:
将两个套接字绑定到同一端口。将端口转发添加到此端口。然后将数据包发送到127.0.0.1和路由器外部ip。
两台计算机都显示,接收的包的最大大小为32kb - 28b。28b是UDP报头大小。我想是的。
然后,我尝试以相同的方式在两台计算机之间进行测试。测试以一种方式显示了相同的结果(例如,当我从comp1发送到comp2时),但当我从comp2发送到comp1时,最大大小约为3kb(2975b)。Comp1不会得到比这个更大的包。
这是程序的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
receiveSocket(),
sendSocket(),
timer(),
packetSend(0),
packetReceived(0),
address(),
sendPort(63465),
receivePort(62345),
{
ui->setupUi(this);
timer.setSingleShot(false);
timer.setInterval(100);
receiveSocket.bind(receivePort);
connect(&timer, SIGNAL(timeout()), this, SLOT(sendData()));
connect(&receiveSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));
connect(ui->startButton, SIGNAL(clicked()), this, SLOT(startStopSend()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::receiveData()
{
unsigned int otherSideSent = 0;
do
{
receiveDatagram.resize(receiveSocket.pendingDatagramSize());
receiveSocket.readDatagram(receiveDatagram.data(), receiveDatagram.size());
}while(receiveSocket.hasPendingDatagrams());
QDataStream in(&receiveDatagram, QIODevice::ReadOnly);
in >> otherSideSent;
float tempVal;
std::vector<float> value;
for (int i=0; i<receiveDatagram.size()/8 - 1;i++ )
{
in >> tempVal;
value.push_back(tempVal);
}
packetReceived++;
ui->packetData->setText(QString("I receive/you sent: ")+QString::number(packetReceived)+QString("/")+QString::number(otherSideSent));
}
void MainWindow::sendData()
{
QDataStream out(&sendDatagram, QIODevice::WriteOnly);
out << ++packetSend;
for(unsigned int i = 0; i < 8185; ++i)
{
out << 1.0 + i/100.0;
}
sendSocket.writeDatagram(sendDatagram, address, sendPort);
}
void MainWindow::startStopSend()
{
if(!timer.isActive())
{
address.setAddress(ui->ipLine->text());
timer.start();
}
else
{
timer.stop();
}
}第一次测试,我认为,没有router1,router2,comp1或comp2限制最大的UDP包的大小。但仅在从comp2到comp1的情况下,最大包大小限制为奇数。
问题是为什么?
发布于 2014-10-20 05:54:07
大多数设备支持高达1500字节的MTU/MRU。事实上,您可以发送/接收比此更大的数据包,这意味着您要么完全启用了巨型帧,要么数据包正在碎片化。
不是100%清楚你在做什么,但是你提到了router external IP。如果这两台计算机位于两个不同的位置,通过两个不同的路由器连接到Internet,那么您发送的超大数据包肯定会被“连接Internet”的路由器分割。
实际上,我认为你可以通过互联网从comp1向comp2发送32KB的数据包,这是很神奇的,因为首先必须对其进行分段的路由器不会太高兴,当它收到32KB大小的数据包时,它必须将其分段为,比方说,32 x 1KB的数据包,更不用说接收端,它将不得不重新组装它。
我不确定你说的“测试udp套接字”到底是什么意思,但由于这个原因,大多数网络测试都是用小于1518 (或1522)字节的数据包进行的。
https://stackoverflow.com/questions/26455638
复制相似问题