c#流在使用TCP发送/接收时乱序

本文关键字:发送 TCP | 更新日期: 2023-09-27 17:50:41

我正在创建一个小型的客户端/服务器应用程序,当我遇到一些似乎是在TCP流中混淆的东西时,所以我写了一个小型测试应用程序

服务器只是创建一个TCP套接字并发送一个递增计数器

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 7777);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(ipEndPoint);
socket.Listen(10);
Socket clientSocket = socket.Accept();
byte test = 0;
while (true)
{
    if (clientSocket.Send(new byte[] { test }, 0, 1, SocketFlags.None) == 1)
    {
        test++;
    }
}

由于这是一个TCP流,我希望客户端的流只是从0到255等等。

在客户端使用以下代码:

IPEndPoint ipEndPoint = new IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 7777);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipEndPoint);
byte[] buffer = new byte[20000];
byte last = 255;
while (true)
{
    int bytesRead = socket.Receive(buffer);
    for (int i = 0; i < bytesRead; i++)
    {
        if (buffer[i] != (byte)(last+1))
        {
            //problem here
        }
        last = buffer[i];
    }
}

if条件不应该返回true,但它确实返回了。在我分析了客户端的流之后,它显示缓冲区经常包含像000 001 002 003 004 005 006 102 103 104 105这样的序列。

我在这里错过了什么?我一直认为TCP可以确保在TCP级别上按订单交付。

Update: Thorarin指出了正确的解决方案。Zone Alarm干扰了流(或者可能是数据包)。我要卸载这个软件

c#流在使用TCP发送/接收时乱序

TCP保证订单交付。我的猜测是你的接收缓冲区出了问题。也许您连接两次并使用相同的缓冲区?

我试着重现你的问题,但是我做不到。我不确定clientSocketState指的是什么,所以我使用了一个常规的字节数组作为缓冲区。我懒惰地用Accept代替BeginAccept,但没有做其他更改。

一定有什么事瞒着我们:-)

更新:考虑到这一切,我开始相信是一些防火墙或杀毒软件给你搞砸了。