Esempio n. 1
0
        public void ReceiveData(object acceptSocketObject)
        {
            Socket client = (Socket)acceptSocketObject;

            client.SendTimeout    = Config.SocketSendTimeOut;
            client.ReceiveTimeout = Config.SocketReceiveTimeOut;
            int error_count = 0;

            while (flag_receive & error_count < 5)
            {
                try
                {
                    ReceiveBytes(client, out HB32Header header, out byte[] bytes);
                    //Display.TimeWriteLine(header.Flag.ToString());
                    switch (header.Flag)
                    {
                    case SocketDataFlag.DirectoryRequest:
                        ResponseDirectory(client, bytes);
                        break;

                    case SocketDataFlag.DirectorySizeRequest:
                        ResponseDirectorySize(client, bytes);
                        break;

                    case SocketDataFlag.CreateDirectoryRequest:
                        ResponseCreateDirectory(client, bytes);
                        break;

                        #region download
                    case SocketDataFlag.DownloadRequest:
                        ResponseDownloadSmallFile(client, bytes);
                        break;

                    case SocketDataFlag.DownloadFileStreamIdRequest:
                        ResponseFileStreamId(client, header, bytes, false);
                        break;

                    case SocketDataFlag.DownloadPacketRequest:
                        ResponseTransferPacket(client, header, bytes, false);
                        break;
                        #endregion

                        #region upload
                    case SocketDataFlag.UploadRequest:
                        ResponseUploadSmallFile(client, bytes);
                        break;

                    case SocketDataFlag.UploadFileStreamIdRequest:
                        ResponseFileStreamId(client, header, bytes, true);
                        break;

                    case SocketDataFlag.UploadPacketRequest:
                        ResponseTransferPacket(client, header, bytes, true);
                        break;
                        #endregion

                    case SocketDataFlag.DisconnectRequest:
                        client.Close();
                        return;

                    default:
                        throw new Exception("Invalid socket header in receiving: " + header.Flag.ToString());
                    }
                    error_count = 0;
                }
                catch (SocketException ex)
                {
                    error_count++;
                    switch (ex.ErrorCode)
                    {
                    // 远程 client 主机关闭连接
                    case 10054:
                        client.Close();
                        Display.WriteLine("connection closed (remote closed)");
                        return;

                    // Socket 超时
                    case 10060:
                        Thread.Sleep(200);
                        continue;

                    default:
                        //System.Windows.Forms.MessageBox.Show("Server receive data :" + ex.Message);
                        Display.WriteLine("Server receive data :" + ex.Message);
                        continue;
                    }
                }
                catch (Exception ex)
                {
                    error_count++;
                    if (ex.Message.Contains("Buffer receive error: cannot receive package"))
                    {
                        client.Close();
                        //Display.TimeWriteLine("connection closed (buffer received none)");
                        return;
                    }
                    if (ex.Message.Contains("Invalid socket header"))
                    {
                        client.Close();
                        Display.TimeWriteLine("connection closed : " + ex.Message);
                        return;
                    }
                    Display.TimeWriteLine("Server exception :" + ex.Message);
                    Thread.Sleep(200);
                    continue;
                }
            }
            Display.TimeWriteLine("Connection closed: error count 5");
        }