TCP ReceiveBufferSize . net框架中的最大大小



我试图使用System.Net.Sockets内部的TCP/Sockets函数来传输文件。但是,当我尝试在客户端和服务器上动态设置缓冲区的大小时,如果大小小于4096,则传输进行得很好,但如果大小大于4096,则缓冲区保留4096的值,因此文件未被完全接收。

所以,我在想?这是最大值吗?如果是,在客户端使用由循环填充的缓冲区,在服务器端使用相同的方法接收缓冲区是否安全?

我曾经用套接字写过一个类似的非常简单的文件接收器(只是为了尝试套接字,所以代码并不是那么漂亮):

  Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  EndPoint endpoint = new IPEndPoint(IPAddress.Any, 2442);
  socket.Bind(endpoint);
  socket.Listen(10000);
  System.Console.WriteLine("Waiting for incoming data on *:2442");
  Socket client = socket.Accept();
  byte[] buffer = new byte[2000];
  List<byte> wholeThing = new List<byte>();
  int count = 0;
  do {
    count = client.Receive(buffer);
    for (int i = 0 ; i < count ; i++)
      wholeThing.Add(buffer[i]);
    System.Console.Write("*");
  } while (count > 0);
  System.Console.WriteLine(Environment.NewLine + "Received {0} bytes of data", wholeThing.Count);
  File.WriteAllBytes(Application.StartupPath + "\receivedFile", wholeThing.ToArray());

发送方代码如下所示:

    byte[] fileData = File.ReadAllBytes(fileName);
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect(IPAddress.Parse(targetip), 2442);
    int offset = 0;
    do {
      try {
        offset = socket.Send(fileData, offset, fileData.Length - offset, SocketFlags.None);
      } catch {
        socket.Close();
        throw;
      }
    } while (offset < fileData.Length);

如果你想发送更大的文件,.net通常会把它们分成更小的块。在客户端接收到数据时,您需要将数据一块一块地重新组装起来。我认为ConnectionPacketBuilder类在networkComms.net,第134行这里实现你想要做的。当数据出现在793行左右时,您可以看到它是如何使用的。

相关内容

  • 没有找到相关文章

最新更新