【发布时间】:2016-03-19 21:16:46
【问题描述】:
我正在尝试从客户端向服务器发送 TCP 数据包,我希望能够选择数据包的大小。我面临的问题是,如果我不设置 Sleep(45)(毫秒),则数据包大小不正确。我使用 Wireshark 查看数据包的大小。
为了确保你们和我在一起,我会尽可能清楚地解释。
我尝试过这样做..
首先,我选择要发送的数据量。例如说 1Mb 或“1000000ish”字节。我分配了一个空间很大的数组。
为了能够发送特定大小的数据包,我分配了一个发送缓冲区,其中包含我想要的数据包大小(我的情况是 64、512、1024 和 1514 字节)。我用字母填充发送缓冲区。假设我想以 64 作为数据包大小发送。
for (int i = 0; i < packetSize; i++){
sendbuf[i] = 'a';
}
要知道我必须发送多少次数据包才能达到 1Mb,我做了这个数学运算。
nrOfTimes = (dataSize / packetSize)。
然后循环发送。
for (int i = 0; i < nrOfTimes; i++) {
rc = send(sConnect, sendbuf, packetSize, 0); //rc and sConnect contains information where to send the data, if you wonder
Sleep(45); // If i dont use this the packet size gets 1514.
}
如果我使用 sleep(45) 它可以工作,但需要数年才能完成,我应该测量时间,所以这样做是不正确的。如果我低于 Sleep(45) 那么我的网卡会忽略数据包大小并将其设置为 1514 大小。
有没有人有明确的想法该怎么做?我只能假设它可能与网卡缓冲区有关。
【问题讨论】:
-
TCP 为您提供字节流,而不是数据包,因此您不能轻易地使 1 个 send() 调用导致 1 个 recv() 调用。接收方是否从您的几个 send() 调用中接收到一堆数据真的很重要吗?
-
TCP 是一个流。因此,您无法发送特定尺寸。您只需继续发送数据,直到数据全部到位。
-
@nos 没错,我的错。我的任务是能够选择数据包的大小。但我不知道是谁做的......
-
如果要发送数据包,则需要面向数据包的协议,而不是 TCP。
-
@PetrusLindblom 那么你被赋予了一项不可能完成的任务。您需要与任务提供者交谈,看看是否有误会。
标签: c++ sockets networking tcp packet