gpt4 book ai didi

c++ - 将拆分的 TCP 数据包与闪存套接字重新组合

转载 作者:行者123 更新时间:2023-11-30 02:08:52 25 4
gpt4 key购买 nike

我有一个用 C++ 编写的程序,它可以一次性将 23723 字节的套接字发送到 Flash 播放器。

Flash 播放器有时会收到两个大小为 17520 和 6203 的数据包,有时会收到一个大小为 23723 的数据包。

编辑:似乎没有办法获取与来自闪存的发送数据关联的总字节数。这将使构建循环来重建“损坏的”数据包变得非常困难。

我认为 TCP 应该正确地重新组合数据包,但我自己重新组合它们时遇到了困难。

这是我在 flash 中的接收处理程序:

var socket:Socket = new Socket();
socket.addEventListener(Event.CONNECT, socketConnectHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataReceivedHandler);
socket.connect("127.0.0.1", 7445);
socket.writeUTFBytes("hi");

private function socketDataReceivedHandler(event:ProgressEvent):void {
var socket:Socket = event.target as Socket;
trace(socket.bytesAvailable);
var data:ByteArray = new ByteArray();
socket.readBytes(data);
}

命令:

trace(socket.bytesAvailable);

有时会打印 23723,有时会打印 17520,然后是 6203。总大小只是示例,每个发送套接字可能会发生变化。也可以同时发送或接收多个套接字,因此拆分的数据包可以相互混合。在 C++ 中,我可以确定发送数据的总大小,即使我还没有收到整个发送数据。

最佳答案

这与tcp无关。只要至少是一个字节,套接字就可以向您发送任意数量的字节。所以你可能会得到 [1, 23722]。正确的做法是循环调用read,自己填充一个数组。如果您的代码不包含循环但可以运行,那么它是偶然运行的。如果没有循环,这将无法工作。

编辑:不要使用 bytesAvailable。检查读取函数的返回值。检查您的代码:如果您的代码依赖于 bytesAvailable,那是错误的。

Edit2:看起来 flash api(我不知道)与所有其他框架和语言使用的套接字 api 的工作方式不同。我假设它会工作相同,所以让我更正:你应该有以下循环:

int writePos = 0;
var array = ...;
while true:
wait for bytes to become available. i do not know how to do this but one method would be 'while bytesAvailable == 0 then sleep 10'
var bytesAvailableCopy = bytesAvailable; //copy because this value can change anytime
socket.read(array, writePos, bytesAvailableCopy );
writePos += bytesAvailableCopy;
if(writePos == maxLength) break;

关于c++ - 将拆分的 TCP 数据包与闪存套接字重新组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6076254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com