C#套接字(服务器)仅接收一半数据

时间:2013-12-04 15:56:49

标签: c# sockets

我有一个这样的程序:

class FTServerCode
    {
        IPEndPoint ipEnd;
        Socket sock;
        public FTServerCode()
        {
           ipEnd = new IPEndPoint(IPAddress.Any, 5656);
           sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
           sock.Bind(ipEnd);
        }
        public static string receivedPath;
        public static string curMsg = "Stopped";
        public  void StartServer()
        {
            try
            {
                curMsg = "Starting...";
                sock.Listen(100);

                curMsg = "Running and waiting to receive file.";
                Socket clientSock = sock.Accept();

                byte[] clientData = new byte[1024 * 5000];

                int receivedBytesLen = clientSock.Receive(clientData);
                curMsg = "Receiving data...";

                int fileNameLen = BitConverter.ToInt32(clientData, 0);
                string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);

                BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
                bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);

                curMsg = "Saving file...";

                bWrite.Close();
                clientSock.Close();
                curMsg = "Reeived & Saved file; Server Stopped.";
            }
            catch (Exception ex)
            {
                curMsg = "File Receving error.";
            }
        }
    }

这个程序可以工作,但不是接收让我们说总文件大小为600KB它只收到6KB的文件。该程序不会崩溃或任何东西,但它只收到一小部分文件。怎么了?

2 个答案:

答案 0 :(得分:3)

问题:您只需拨打Receive()一次即可阅读。

Soution:您需要阅读data,除非Receive函数为您提供。while循环以确定data是否为 int recv=0; byte[] data = new byte[1024]; StringBuilder sb= new StringBuilder(); while ((recv=clientSock.Receive(data)) > 0) { sb.Append(Encoding.ASCII.GetString(data, 0, recv)); } 可用与否。

试试这个:

class FTServerCode
{
   IPEndPoint ipEnd;
   Socket sock;
   public FTServerCode()
   {
      ipEnd = new IPEndPoint(IPAddress.Any, 5656);
      sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
      sock.Bind(ipEnd);
   }
   public static string receivedPath;
   public static string curMsg = "Stopped";
   public  void StartServer()
   {
      try
      {
         curMsg = "Starting...";
         sock.Listen(100);

         curMsg = "Running and waiting to receive file.";
         Socket clientSock = sock.Accept();

         byte[] clientData = new byte[1024];
         StringBuilder sb= new StringBuilder();
         int receivedBytesLen = 0;
         int fileNameLen = 0;
         string fileName = "";
         BinaryWriter bWrite;
         while((receivedBytesLen =clientSock.Receive(clientData))>0)
         {
            curMsg = "Receiving data..."; 
            fileNameLen = BitConverter.ToInt32(clientData, 0);
            fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);

            bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
            bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
         }
         curMsg = "Saving file...";

         bWrite.Close();
         clientSock.Close();
         curMsg = "Reeived & Saved file; Server Stopped.";
      }
      catch (Exception ex)
      {
         curMsg = "File Receving error.";
      }
   }
}

完整代码:

{{1}}

答案 1 :(得分:1)

您很可能需要将其置于循环中,直到读取调用返回0

 int receivedBytesLen = clientSock.Receive(clientData);
相关问题