2013-02-09 90 views
1

我一直在編寫一個文件服務器/客戶端應用程序在C#中,它似乎正在工作,但後來我意識到該流沒有被提前和客戶端保持無法從服務器接收。所以我查了wireshark,看到我的客戶端正在發出TCPZeroWindow標記的數據包。有什麼想法嗎?謝謝。TCP ZeroWindow問題C#

客戶:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
namespace PortalClient 
{ 
    class Program 
    { 
     static string s1; 
     static byte[] data03; 
     static int int02; 
     static string str01; 
     static int length; 
     static IPEndPoint ipe01; 
     static TcpClient tcp01; 
     static FileStream s01; 
     static string ip01; 
     static string port01; 
     static string path01; 
     static byte[] data01; 
     static byte[] data02; 
     static byte[] data04; 
     static void Main(string[] args) 
     { 

      while (true) 
      { 
      label1: 
       { 
        try 
        { 
         string version = "V:1.1.4"; 
         Console.Title = (" Portal Client " + version); 
         ConsoleColor ccolor1 = new ConsoleColor(); 
         ccolor1 = Console.ForegroundColor; 
         Console.ForegroundColor = ConsoleColor.Green; 
         Console.WriteLine(); 
         Console.WriteLine("   PORTAL CLIENT " + version); 
         Console.WriteLine(); 
         Console.ForegroundColor = ccolor1; 
         data01 = new byte[20]; 
         data03 = new byte[100]; 
         data04 = new byte[100]; 
         Console.Write(" Enter IPv4 address of server : "); 
         ip01 = Console.ReadLine(); 
         Console.Write(" Enter port to connect on : "); 
         port01 = Console.ReadLine(); 
         ipe01 = new IPEndPoint(IPAddress.Parse(ip01), Convert.ToInt32(port01)); 
         tcp01 = new TcpClient(); 
         tcp01.ReceiveTimeout = 2500; 
         tcp01.NoDelay = true; 
         Console.WriteLine(" Connecting..."); 
         tcp01.Connect(ipe01); 
         Console.WriteLine(" Done."); 
         tcp01.Client.Receive(data04, SocketFlags.None); 
         System.Threading.Thread.Sleep(100); 
         Console.WriteLine(" Server message : " + Encoding.UTF8.GetString(data04)); 
         tcp01.Client.Receive(data03, SocketFlags.None); 
         System.Threading.Thread.Sleep(100); 
         Console.WriteLine(" File on server : " + Encoding.UTF8.GetString(data03)); 
         tcp01.Client.Receive(data01, SocketFlags.None); 
         System.Threading.Thread.Sleep(100); 
         str01 = Encoding.UTF8.GetString(data01); 
         Console.WriteLine(); 
         Console.WriteLine(" file size : " + str01); 
         Console.WriteLine(); 
         Console.Write(" Enter the number you see above : "); 
         length = Convert.ToInt32(Console.ReadLine()); 
         Console.Write(" Save file as : "); 
         path01 = Console.ReadLine(); 
         for (int i = 1; i <= 9000; i++) 
         { 
          if (length % i == 0) { int02 = i; } 
         } 
         if (length < 9000) { int02 = length; } 
         int int03 = length/int02; 
         s01 = File.OpenWrite(@path01); 
         Console.WriteLine(" Receiving file from " + tcp01.Client.RemoteEndPoint.ToString() + "..."); 
         tcp01.Client.Send(new byte[1], SocketFlags.None); 
         System.Threading.Thread.Sleep(1000); 
         for (int i = 0; i <= int03; i++) 
         { 
          bool bool1 = false; 
          data02 = new byte[int02]; 
          int n = tcp01.Client.Receive(data02, 0, int02, SocketFlags.None); 
          while (n < int02) 
          { 
           Console.WriteLine(" Entered Loop "); 
           int int04 = int02 - n; 
           tcp01.Client.Send(Encoding.UTF8.GetBytes("2"), 0, 1, SocketFlags.None); 
           int int05 = 0; 
           byte[] data05 = new byte[int04]; 
           if (int04 >= 1 && int04 <= 9) { s1 = int04 + "xxx"; } 
           if (int04 >= 10 && int04 <= 99) { s1 = int04 + "xx"; } 
           if (int04 >= 100 && int04 <= 999) { s1 = int04 + "x"; } 
           if (int04 >= 1000 && int04 <= 9000) { s1 = int04.ToString(); } 
           tcp01.Client.Send(Encoding.UTF8.GetBytes(s1), 0, 4, SocketFlags.None); 
           int05 = tcp01.Client.Receive(data05, 0, int04, SocketFlags.None); 
           n = n + int05; 
           s01.Write(data05, 0, int05); 
           bool1 = true; 
          } 
          if (bool1 == false) 
          { 
           s01.Write(data02, 0, int02); 
           tcp01.Client.Send(new byte[1], 0, 1, SocketFlags.None); 
          } 
         } 
         System.Threading.Thread.Sleep(1000); 
         s01.Close(); 
         Console.WriteLine(" Received all data."); 
         Console.WriteLine(" Press enter to disconnect..."); 
         Console.ReadLine(); 
         tcp01.Client.Send(new byte[1], SocketFlags.None); 
         System.Threading.Thread.Sleep(1000); 
         Console.WriteLine(" Disconnecting..."); 
         tcp01.Close(); 
         Console.WriteLine(" Done."); 
        } 
        catch (Exception e) 
        { 
         Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString()); if (!(tcp01 == null)) { tcp01.Close(); } if (!(s01 == null)) { s01.Close(); goto label1; } 
        } 
       } 

      } 
     } 
    } 
} 

服務器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
namespace PortalServer 
{ 
    class Program 
    { 
     static long length; 
     static int int03; 
     static int int02; 
     static TcpListener tcp01; 
     static TcpClient tcp02; 
     static FileStream s01; 
     static byte[] data01; 
     static byte[] data03; 
     static byte[] data04; 
     static byte[] data05; 
     static string str01; 
     static string str02; 
     static IPEndPoint ipe01; 
     static string port01; 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
      label1: 
       try 
       { 
        string version = "V:1.1.4"; 
        Console.Title = (" Portal Server " + version); 
        ConsoleColor ccolor1 = new ConsoleColor(); 
        ccolor1 = Console.ForegroundColor; 
        Console.ForegroundColor = ConsoleColor.Green; 
        Console.WriteLine(); 
        Console.WriteLine("   PORTAL SERVER " + version); 
        Console.WriteLine(); 
        Console.ForegroundColor = ccolor1; 
        Console.Write(" Enter port for connecting clients : "); 
        port01 = Console.ReadLine(); 
        Console.Write(" Enter path of file to send : "); 
        str01 = Console.ReadLine(); 
        ipe01 = new IPEndPoint(IPAddress.Any, Convert.ToInt32(port01)); 
        tcp01 = new TcpListener(ipe01); 
        Console.Write(" Enter server message : "); 
        str02 = Console.ReadLine(); 
        s01 = File.OpenRead(@str01); 
        length = s01.Length; 
        for (int i = 1; i <= 9000; i++) 
        { 
         if (length % i == 0) { int02 = i; } 
        } 
        if (length < 9000) { int02 = (int)length;} 

        int03 = (int)length/int02; 
        tcp01.Start(); 
        Console.WriteLine(" Server started. Waiting for clients..."); 
        tcp02 = tcp01.AcceptTcpClient(); 
        tcp02.Client.NoDelay = true; 
        Console.WriteLine(" Client " + tcp02.Client.RemoteEndPoint.ToString() + " connected."); 
        data05 = Encoding.UTF8.GetBytes(str02); 
        tcp02.Client.Send(data05, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        data04 = Encoding.UTF8.GetBytes(str01); 
        tcp02.Client.Send(data04, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        data03 = Encoding.UTF8.GetBytes(length.ToString()); 
        tcp02.Client.Send(data03, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        Console.WriteLine(" Waiting for response..."); 
        tcp02.Client.Receive(new byte[1], SocketFlags.None); 
        Console.WriteLine(" Received response..."); 
        Console.WriteLine(" Sending file to " + tcp02.Client.RemoteEndPoint.ToString() + "..."); 
        System.Threading.Thread.Sleep(1); 
        for (int i = 0; i <= int03;i++) 
        { 
         System.Threading.Thread.Sleep(30); 
         data01 = new byte[int02]; 
         s01.Read(data01, 0, data01.Length); 
         int n = tcp02.Client.Send(data01, 0 ,data01.Length, SocketFlags.None); 
         if (n != int02) { throw new Exception("unable to write bytes, insufficient memory."); } 
         byte[] data07 = new byte[1]; 
         while (true) 
         { 
          tcp02.Client.Receive(data07,0,1,SocketFlags.None); 
          if (Encoding.UTF8.GetString(data07) == "2") 
          { 
           byte[] data06 = new byte[4]; 
           int b = tcp02.Client.Receive(data06, 0, 4, SocketFlags.None); 
           if (b != 4) { throw new Exception("ex1"); } 
           string s1 = Encoding.UTF8.GetString(data06); 
           s1 = s1.Replace("x", ""); 
           int int05 = Convert.ToInt32(s1); 
           int int06 = int02 - int05; 
           byte[] data08 = new byte[int05]; 
           Buffer.BlockCopy(data01, int06, data08, 0, int05); 
           tcp02.Client.Send(data08, 0, data08.Length, SocketFlags.None); 
           System.Threading.Thread.Sleep(30); 
          } 
          break; 
         } 
        } 
        System.Threading.Thread.Sleep(1000); 
        s01.Close(); 
        Console.WriteLine(" All data sent."); 
        Console.WriteLine(" Waiting for terminate message..."); 
        tcp02.Client.Receive(new byte[1], SocketFlags.None); 
        Console.WriteLine(" Received terminate message."); 
        tcp02.Close(); 
        Console.WriteLine(" Stopping client and server."); 
        tcp01.Stop(); 
        Console.WriteLine(" Done. Restarting."); 

       } 

       catch (Exception e) 
       { 
        Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString()); 
        if (!(tcp02 == null)) { tcp02.Close(); } 
        if (!(tcp01 == null)) { tcp01.Stop(); goto label1; } 
       } 
      } 
     } 
    } 
} 

回答

0

我用繁重的提升發送/接收方法的單獨線程,增加的緩衝區大小,增加發送之間的時間,確保碎片化。像現在的魅力一樣工作。

客戶端:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.ComponentModel; 
namespace PortalClient 
{ 
    class Program 
    { 
     static int partloop; 
     static bool bool1; 
     static byte[] data05; 
     static int int03; 
     static int int04; 
     static int int05; 
     static int numbytesreceived; 
     static BackgroundWorker bw1; 
     static int bytestoreceive; 
     static string s1; 
     static byte[] data03; 
     static int int02; 
     static string str01; 
     static int length; 
     static IPEndPoint ipe01; 
     static TcpClient tcp01; 
     static FileStream s01; 
     static string ip01; 
     static string port01; 
     static string path01; 
     static byte[] data01; 
     static byte[] data02; 
     static byte[] data04; 
     static void Main(string[] args) 
     { 
      newvoid(); 
     } 
     static void newvoid() 
     { 
      while (true) 
      { 
       try 
       { 
        Console.Clear(); 
        Console.WindowWidth = 95; 
        string version = "V:1.1.4"; 
        Console.Title = (" Portal Client " + version); 
        ConsoleColor ccolor1 = new ConsoleColor(); 
        ccolor1 = Console.ForegroundColor; 
        Console.ForegroundColor = ConsoleColor.Green; 
        Console.WriteLine(); 
        Console.WriteLine(@" 
__________    __   .__ _________ .__ .__    __ 
\______ \____________/ |______ | | \_ ___ \| | |__| ____ _____/ |_ 
    |  ___/ _ \_ __ \ __\__ \ | | / \ \/| | | |/ __ \/ \ __\ 
    | | ( <_>) | \/| |/__ \| |__ \  \___| |_| \ ___/| | \ | 
    |____| \____/|__| |__| (____ /____/ \______ /____/__|\___ >___| /__| 
            \/    \/    \/  \/  " + version); 
        Console.WriteLine(); 
        Console.ForegroundColor = ccolor1; 
        data01 = new byte[20]; 
        data03 = new byte[100]; 
        data04 = new byte[100]; 
        Console.Write(" Enter IPv4 address of server : "); 
        ip01 = Console.ReadLine(); 
        Console.Write(" Enter port to connect on : "); 
        port01 = Console.ReadLine(); 
        ipe01 = new IPEndPoint(IPAddress.Parse(ip01), Convert.ToInt32(port01)); 
        tcp01 = new TcpClient(); 
        Console.WriteLine(" Connecting..."); 
        tcp01.Connect(ipe01); 
        Console.WriteLine(" Done."); 
        tcp01.Client.Receive(data04, SocketFlags.None); 
        System.Threading.Thread.Sleep(100); 
        Console.WriteLine(" Server message : " + Encoding.UTF8.GetString(data04)); 
        tcp01.Client.Receive(data03, SocketFlags.None); 
        System.Threading.Thread.Sleep(100); 
        Console.WriteLine(" File on server : " + Encoding.UTF8.GetString(data03)); 
        tcp01.Client.Receive(data01, SocketFlags.None); 
        System.Threading.Thread.Sleep(100); 
        str01 = Encoding.UTF8.GetString(data01); 
        Console.WriteLine(); 
        Console.WriteLine(" file size : " + str01); 
        Console.WriteLine(); 
        Console.Write(" Enter the number you see above : "); 
        length = Convert.ToInt32(Console.ReadLine()); 
        bytestoreceive = length; 
        Console.Write(" Save file as : "); 
        path01 = Console.ReadLine(); 
        for (int i = 1; i <= 60000; i++) 
        { 
         if (length % i == 0) { int02 = i; } 
        } 
        if (length < 60000) { int02 = length; } 
        int03 = length/int02; 
        s01 = File.OpenWrite(@path01); 
        Console.WriteLine(" Receiving file from " + tcp01.Client.RemoteEndPoint.ToString() + "..."); 
        tcp01.Client.Send(new byte[1], SocketFlags.None); 
        System.Threading.Thread.Sleep(1000); 
        while (bytestoreceive > 0) 
        { 
         bw1 = new BackgroundWorker(); 
         bw1.DoWork += new DoWorkEventHandler(bw1_DoWork); 
         bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted); 
         bool1 = false; 
         numbytesreceived = 0; 
         data02 = new byte[int02]; 
         bw1.RunWorkerAsync(); 
         while (numbytesreceived == 0) { } 
         while (numbytesreceived < int02) 
         { 
          bw1 = new BackgroundWorker(); 
          bw1.DoWork += new DoWorkEventHandler(bw1_DoWork); 
          bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted); 
          bool1 = true; 
          partloop += 1; 
          int04 = int02 - numbytesreceived; 
          tcp01.Client.Send(Encoding.UTF8.GetBytes("2"), 0, 1, SocketFlags.None); 
          int05 = 0; 
          data05 = new byte[int04]; 
          if (int04 >= 1 && int04 <= 9) { s1 = int04 + "xxxx"; } 
          if (int04 >= 10 && int04 <= 99) { s1 = int04 + "xxx"; } 
          if (int04 >= 100 && int04 <= 999) { s1 = int04 + "xx"; } 
          if (int04 >= 1000 && int04 <= 9999) { s1 = int04 + "x"; } 
          if (int04 > 10000 && int04 <= 60000) { s1 = int04.ToString(); } 
          tcp01.Client.Send(Encoding.UTF8.GetBytes(s1), 0, 5, SocketFlags.None); 
          bw1.RunWorkerAsync(); 
          while (int05 == 0) { } 
          if (int05 == 0) { throw new Exception("ex1"); } 
          numbytesreceived += int05; 
          bytestoreceive -= numbytesreceived; 
          s01.Write(data05, 0, data05.Length); 
          Console.WriteLine(" Received " + (length - bytestoreceive) + "/" + length + " bytes | P.B.R. loops: " + partloop.ToString()); 
          Console.SetCursorPosition(0, Console.CursorTop - 1); 
         } 

         if (bool1 == false) 
         { 

          bytestoreceive -= numbytesreceived; 
          s01.Write(data02, 0, int02); 
          tcp01.Client.Send(new byte[1], 0, 1, SocketFlags.None); 
          Console.WriteLine(" Received " + (length - bytestoreceive) + "/" + length + " bytes | P.B.R. loops: " + partloop.ToString()); 
          Console.SetCursorPosition(0, Console.CursorTop - 1); 
         } 
        } 
        Console.SetCursorPosition(0, Console.CursorTop + 1); 
        Console.WriteLine(); 
        System.Threading.Thread.Sleep(500); 
        s01.Close(); 
        Console.WriteLine(" Received all data."); 
        Console.WriteLine(" Press enter to disconnect..."); 
        Console.ReadLine(); 
        tcp01.Client.Send(new byte[1], SocketFlags.None); 
        System.Threading.Thread.Sleep(1000); 
        Console.WriteLine(" Disconnecting..."); 
        tcp01.Close(); 
        Console.WriteLine(" Done."); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString()); 
        if (!(tcp01 == null)) { tcp01.Close(); } 
        if (!(s01 == null)) { s01.Close(); } 
        Console.Write(" Press enter to continue..."); Console.ReadLine(); 
        newvoid(); 
       } 
      } 
     } 

     static void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      try 
      { 
       bw1.Dispose(); 
      } 
      catch (Exception e1) 
      { 
       Console.WriteLine(" Error! : " + e1.Message.ToString() + " - " + e1.Data.ToString() + " - " + e1.TargetSite.ToString()); 
       if (!(tcp01 == null)) { tcp01.Close(); } 
       if (!(s01 == null)) { s01.Close(); } 
       Console.Write(" Press enter to continue..."); Console.ReadLine(); 
       newvoid(); 
      } 
     } 

     static void bw1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       if (bool1 == false) 
       { 
        numbytesreceived = tcp01.Client.Receive(data02, 0, int02, SocketFlags.None); 
       } 
       if (bool1 == true) 
       { 
        int05 = tcp01.Client.Receive(data05, 0, int04, SocketFlags.None); 
       } 
      } 
      catch (Exception e2) 
      { 
       Console.WriteLine(" Error! : " + e2.Message.ToString() + " - " + e2.Data.ToString() + " - " + e2.TargetSite.ToString()); 
       if (!(tcp01 == null)) { tcp01.Close(); } 
       if (!(s01 == null)) { s01.Close(); } 
       Console.Write(" Press enter to continue..."); Console.ReadLine(); 
       newvoid(); 
      } 
     } 
    } 
} 

服務器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 
using System.ComponentModel; 
namespace PortalServer 
{ 
    class Program 
    { 
     static int bytesresent; 
     static BackgroundWorker bw1; 
     static int int06; 
     static int int05; 
     static string string01; 
     static int bytesCreceived; 
     static byte[] data06; 
     static byte[] data07; 
     static byte[] data08; 
     static int bytessent; 
     static bool bool1; 
     static int bytestosend; 
     static long length; 
     static int int03; 
     static int int02; 
     static TcpListener tcp01; 
     static TcpClient tcp02; 
     static FileStream s01; 
     static byte[] data01; 
     static byte[] data03; 
     static byte[] data04; 
     static byte[] data05; 
     static string str01; 
     static string str02; 
     static IPEndPoint ipe01; 
     static string port01; 
     static void Main(string[] args) 
     { 
      newvoid(); 
     } 
     static void newvoid() 
     { 
      while (true) 
      { 
       try 
       { 
        Console.Clear(); 
        Console.WindowWidth = 95; 
        string version = "V:1.1.4"; 
        Console.Title = (" Portal Server " + version); 
        ConsoleColor ccolor1 = new ConsoleColor(); 
        ccolor1 = Console.ForegroundColor; 
        Console.ForegroundColor = ConsoleColor.Green; 
        Console.WriteLine(); 
        Console.WriteLine(@" 
__________    __   .__  _________         
\______ \____________/ |______ | | / _____/ ______________ __ ___________ 
    |  ___/ _ \_ __ \ __\__ \ | | \_____ \_/ __ \_ __ \ \/ // __ \_ __ \ 
    | | ( <_>) | \/| |/__ \| |__/  \ ___/| | \/\ /\ ___/| | \/ 
    |____| \____/|__| |__| (____ /____/ /_______ /\___ >__| \_/ \___ >__| 
            \/    \/  \/     \/  " + version); 
        Console.WriteLine(); 
        Console.ForegroundColor = ccolor1; 
        Console.Write(" Enter port for connecting clients : "); 
        port01 = Console.ReadLine(); 
        Console.Write(" Enter path of file to send : "); 
        str01 = Console.ReadLine(); 
        ipe01 = new IPEndPoint(IPAddress.Any, Convert.ToInt32(port01)); 
        tcp01 = new TcpListener(ipe01); 
        Console.Write(" Enter server message : "); 
        str02 = Console.ReadLine(); 
        s01 = File.OpenRead(@str01); 
        length = s01.Length; 
        bytestosend = (int)length; 
        for (int i = 1; i <= 60000; i++) 
        { 
         if (length % i == 0) { int02 = i; } 
        } 
        if (length < 60000) { int02 = (int)length; } 

        int03 = (int)length/int02; 
        tcp01.Start(); 
        Console.WriteLine(" Server started. Waiting for clients..."); 
        tcp02 = tcp01.AcceptTcpClient(); 
        Console.WriteLine(" Client " + tcp02.Client.RemoteEndPoint.ToString() + " connected."); 
        data05 = Encoding.UTF8.GetBytes(str02); 
        tcp02.Client.Send(data05, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        data04 = Encoding.UTF8.GetBytes(str01); 
        tcp02.Client.Send(data04, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        data03 = Encoding.UTF8.GetBytes(length.ToString()); 
        tcp02.Client.Send(data03, SocketFlags.None); 
        System.Threading.Thread.Sleep(500); 
        Console.WriteLine(" Waiting for response..."); 
        tcp02.Client.Receive(new byte[1], SocketFlags.None); 
        Console.WriteLine(" Received response..."); 
        Console.WriteLine(" Sending file to " + tcp02.Client.RemoteEndPoint.ToString() + "..."); 
        System.Threading.Thread.Sleep(1); 
        while (bytestosend > 0) 
        { 
         System.Threading.Thread.Sleep(50); 
         bool1 = false; 
         bytessent = 0; 
         bw1 = new BackgroundWorker(); 
         bw1.DoWork += new DoWorkEventHandler(bw1_DoWork); 
         bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted); 
         data01 = new byte[int02]; 
         s01.Read(data01, 0, data01.Length); 
         bw1.RunWorkerAsync(); 
         while (bytessent == 0) { } 
         if (bytessent != int02) { throw new Exception("unable to write bytes, insufficient memory."); } 
         while (true) 
         { 
          data07 = new byte[1]; 
          tcp02.Client.Receive(data07, 0, 1, SocketFlags.None); 
          if (Encoding.UTF8.GetString(data07) == "2") 
          { 
           bytesresent = 0; 
           bool1 = true; 
           bw1 = new BackgroundWorker(); 
           bw1.DoWork += new DoWorkEventHandler(bw1_DoWork); 
           bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted); 
           data06 = new byte[5]; 
           bytesCreceived = tcp02.Client.Receive(data06, 0, 5, SocketFlags.None); 
           if (bytesCreceived != 5) { throw new Exception("invalid client response."); } 
           string01 = Encoding.UTF8.GetString(data06); 
           string01 = string01.Replace("x", ""); 
           int05 = Convert.ToInt32(string01); 
           int06 = int02 - int05; 
           bytestosend -= int05; 
           data08 = new byte[int05]; 
           Buffer.BlockCopy(data01, int06, data08, 0, int05); 
           bw1.RunWorkerAsync(); 
           while (bytesresent == 0) { } 
           Console.WriteLine(" Sent " + (length - bytestosend) + "/" + length + " bytes"); 
           Console.SetCursorPosition(0, Console.CursorTop - 1); 
           System.Threading.Thread.Sleep(50); 
          } 
          if (Encoding.UTF8.GetString(data07) != "2") 
          { 
           bool1 = false; 
           bytestosend -= bytessent; 
           Console.WriteLine(" Sent " + (length - bytestosend) + "/" + length + " bytes"); 
           Console.SetCursorPosition(0, Console.CursorTop - 1); 
           break; 
          } 
         } 
        } 
        Console.SetCursorPosition(0, Console.CursorTop + 1); 
        Console.WriteLine(); 
        System.Threading.Thread.Sleep(500); 
        s01.Close(); 
        Console.WriteLine(" All data sent."); 
        Console.WriteLine(" Waiting for terminate message..."); 
        tcp02.Client.Receive(new byte[1], SocketFlags.None); 
        Console.WriteLine(" Received terminate message."); 
        tcp02.Close(); 
        Console.WriteLine(" Stopping client and server."); 
        tcp01.Stop(); 
        Console.WriteLine(" Done. Press enter to continue..."); 
        Console.ReadLine(); 
       } 

       catch (Exception e) 
       { 
        Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString()); 
        if (!(tcp02 == null)) { tcp02.Close(); } 
        if (!(tcp01 == null)) { tcp01.Stop(); } 
        if (!(s01 == null)) { s01.Close(); } 
        Console.Write(" Press enter to continue..."); Console.ReadLine(); 
        newvoid(); 
       } 
      } 
     } 

     static void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      try 
      { 
       bw1.Dispose(); 
      } 
      catch (Exception e1) 
      { 
       Console.WriteLine(" Error! : " + e1.Message.ToString() + " - " + e1.Data.ToString() + " - " + e1.TargetSite.ToString()); 
       if (!(tcp02 == null)) { tcp02.Close(); } 
       if (!(tcp01 == null)) { tcp01.Stop(); } 
       if (!(s01 == null)) { s01.Close(); } 
       Console.Write(" Press enter to continue..."); Console.ReadLine(); 
       newvoid(); 
      } 
     } 

     static void bw1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       if (bool1 == false) 
       { 
        bytessent = tcp02.Client.Send(data01, 0, data01.Length, SocketFlags.None); 
       } 
       if (bool1 == true) 
       { 
        bytesresent = tcp02.Client.Send(data08, 0, data08.Length, SocketFlags.None); 
       } 
      } 
      catch(Exception e2) 
      { 
       Console.WriteLine(" Error! : " + e2.Message.ToString() + " - " + e2.Data.ToString() + " - " + e2.TargetSite.ToString()); 
       if (!(tcp02 == null)) { tcp02.Close(); } 
       if (!(tcp01 == null)) { tcp01.Stop(); } 
       Console.Write(" Press enter to continue..."); Console.ReadLine(); 
       if (!(s01 == null)) { s01.Close(); } 
       newvoid(); 
      } 
     } 
    } 
} 
1

我已經看到這種情況發生,如果你沒有在客戶端正確清空網絡緩存和TCP窗口大小減少到零作爲結果。

這可能與您使用的

tcp01.Client.Receive(data04, SocketFlags.None); 

可能無法充分清除緩衝區中發生的事情,看到MSDN。您想要連續呼叫接收,直到沒有其他數據可用。

如果您想舉一個實例作爲比較,請參閱here

+0

我使用的Array.Clear()方法,然後將垃圾收集器,仍具有相同的結果。您提供給接收方法的緩衝區上的Array.Clear()是否爲 – user2038443 2013-02-09 23:29:52

+0

?即我的例子中的data04?如果是這樣,那不是我指的緩衝區。網絡緩衝區是複製到data04的內容,如果您沒有足夠的時間調用receive方法,那麼您仍然有數據留在網絡緩衝區中,這可能會導致您的問題。這只是我最好的猜測。 – MarcF 2013-02-09 23:32:37

+0

我怎麼可以在不終止正在進行的連接的情況下清除網絡緩衝區? – user2038443 2013-02-09 23:53:31