gpt4 book ai didi

C# 线程在套接字上接收数据之前退出

转载 作者:太空宇宙 更新时间:2023-11-03 13:04:33 24 4
gpt4 key购买 nike

我正在尝试使用套接字和内存流通过网络发送一些文本。我示例中的完整数据长度为 20480 字节长。缓冲区大小为 8192。在我接收到最后 4096 个字节之前,套接字仅接收到 3088 个字节,并且整个线程在接收到最后一个数据 block 之前退出而没有抛出异常。

// Send
while (sentBytes < ms.Length)
{
if (streamSize < Convert.ToInt64(buffer.Length))
{
ms.Read(buffer, 0, Convert.ToInt32(streamSize));
count = socket.Send(buffer, 0, Convert.ToInt32(streamSize), SocketFlags.None);
sentBytes += Convert.ToInt64(count);
streamSize -= Convert.ToInt64(count);
}
else
{
ms.Read(buffer, 0, buffer.Length);
count = socket.Send(buffer, 0, buffer.Length, SocketFlags.None);
sentBytes += Convert.ToInt64(count);
streamSize -= Convert.ToInt64(count);
}
}

// Receive
while (readBytes < size)
{
if (streamSize < Convert.ToInt64(buffer.Length))
// exits after this, before receiving the last 1008 bytes
{
count = socket.Receive(buffer, 0, Convert.ToInt32(streamSize), SocketFlags.None);
if (count > 0)
{
ms.Write(buffer, 0, count);
readBytes += Convert.ToInt64(count);
streamSize -= Convert.ToInt64(count);
}
}
else
{
count = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (count > 0)
{
ms.Write(buffer, 0, count);
readBytes += Convert.ToInt64(count);
streamSize -= Convert.ToInt64(count);
}
}
}

我使用完全相同的算法来发送/接收具有更大尺寸(超过 1 GB)的文件并且传输工作完美,没有文件被损坏(我为此使用文件流)。有趣的是,如果我在发送端添加一个断点,这段代码在调试器中工作。

也适用于此修改:

if (streamSize < Convert.ToInt64(buffer.Length))
{
if (count > 0)
{
ms.Write(buffer, 0, Convert.ToInt32(streamSize));
readBytes += streamSize;
streamSize -= streamSize;
}
}

但这并没有检查接收到的数据量,也无法传输文件。谁能指出这是怎么回事?


话题是这样开始的:

public ClientConnection(Socket clientSocket, Server mainForm)
{
this.clientSocket = clientSocket;
clientThread = new Thread(ReceiveData);
clientConnected = true;
this.mainForm = mainForm;
clientThread.Start(clientSocket);
}

由 OP 从评论中添加

// text is 10240 characters long 
MemoryStream ms = new MemoryStream(UnicodeEncoding.Unicode.GetBytes(text));
// streamsize is 20480, which is sent prior to text in a header to the receiver
long streamSize = ms.Length;

更新:测试了更多文件,现在文件传输也失败了。在所有情况下,问题都出在最后 1008 个字节。

最佳答案

我发现了...当我希望收到 header 时,我没有准备好软件来接收完全 header 大小的数据。

//byte[] buffer = new byte[1024];
byte[] buffer = new byte[16];
readBytes = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);

每次我接收到有效负载的最后一 block 时,这都会以某种方式导致在套接字上写入 16 字节的恶意数据,套接字断开连接并且线程退出时没有抛出任何异常。我希望这个答案有一天能帮助其他人遇到同样的问题。现在所有数据传输工作正常。

关于C# 线程在套接字上接收数据之前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189675/

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