void OnAccept(IAsyncResult asyncResult)
        {
            Socket clientSocket = null;

            try
            {
                clientSocket = listenSocket.EndAccept(asyncResult);

                // Wait for next client
                this.listenSocket.BeginAccept(OnAccept, null);

                IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;
                Console.WriteLine("Connection from {0}.{1}", clientIp.Address, clientIp.Port);
                SendReceiveState receiveState = new SendReceiveState
                {
                    Server            = this,
                    ClientState       = SimpleEchoServer.ClientState.ReceivingLength,
                    ClientSocket      = clientSocket,
                    Buffer            = new byte[4],
                    SendReceiveOffset = 0,
                    Count             = 4,
                };

                clientSocket.BeginReceive(receiveState.Buffer, receiveState.SendReceiveOffset, receiveState.Count, SocketFlags.None, OnReceive, receiveState);
            }
            catch (ObjectDisposedException)
            {
                // socket closed
            }
            catch (SocketException e)
            {
                Console.WriteLine("Socket exception: {0}", e);
            }
        }
示例#2
0
        void OnAccept(IAsyncResult asyncResult)
        {
            Socket clientSocket = null;
            try
            {
                clientSocket = listenSocket.EndAccept(asyncResult);

                // Wait for next client
                this.listenSocket.BeginAccept(OnAccept, null);

                IPEndPoint clientIp = (IPEndPoint)clientSocket.RemoteEndPoint;
                Console.WriteLine("Connection from {0}.{1}", clientIp.Address, clientIp.Port);
                SendReceiveState receiveState = new SendReceiveState
                {
                    Server = this,
                    ClientState = SimpleEchoServer.ClientState.ReceivingLength,
                    ClientSocket = clientSocket,
                    Buffer = new byte[4],
                    SendReceiveOffset = 0,
                    Count = 4,
                };

                clientSocket.BeginReceive(receiveState.Buffer, receiveState.SendReceiveOffset, receiveState.Count, SocketFlags.None, OnReceive, receiveState);
            }
            catch (ObjectDisposedException)
            {
                // socket closed
            }
            catch (SocketException e)
            {
                Console.WriteLine("Socket exception: {0}", e);
            }
        }
        void OnSend(IAsyncResult asyncResult)
        {
            SendReceiveState state = (SendReceiveState)asyncResult.AsyncState;

            try
            {
                int bytesSent = state.ClientSocket.EndSend(asyncResult);
                if (bytesSent == 0)
                {
                    // Client closing the socket
                    state.ClientSocket.Close();
                }
                else
                {
                    if (bytesSent < state.Count)
                    {
                        state.SendReceiveOffset += bytesSent;
                        state.ClientSocket.BeginSend(state.Buffer, state.SendReceiveOffset, state.Count - state.SendReceiveOffset, SocketFlags.None, OnSend, state);
                    }
                    else
                    {
                        switch (state.ClientState)
                        {
                        case ClientState.SendingLength:
                            Console.WriteLine("Sent {0} bytes for the length", state.Count);
                            state.ClientState       = ClientState.SendingData;
                            state.Buffer            = state.Data;
                            state.SendReceiveOffset = 0;
                            state.Count             = state.Data.Length;
                            state.ClientSocket.BeginSend(state.Buffer, 0, state.Count, SocketFlags.None, OnSend, state);
                            break;

                        case ClientState.SendingData:
                            Console.WriteLine("Sent {0} bytes for the data", state.Count);
                            Debugging.PrintBytes(state.Buffer, state.Count);
                            SendReceiveState receiveState = new SendReceiveState
                            {
                                Server            = this,
                                ClientState       = SimpleEchoServer.ClientState.ReceivingLength,
                                ClientSocket      = state.ClientSocket,
                                Buffer            = new byte[4],
                                SendReceiveOffset = 0,
                                Count             = 4,
                            };
                            Formatting.SizeToBytes(state.Count, state.Buffer, 0);
                            state.ClientSocket.BeginReceive(state.Buffer, 0, 4, SocketFlags.None, OnReceive, receiveState);
                            break;
                        }
                    }
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
        }
        void OnReceive(IAsyncResult asyncResult)
        {
            SendReceiveState state = (SendReceiveState)asyncResult.AsyncState;

            try
            {
                int bytesReceived = state.ClientSocket.EndReceive(asyncResult);
                if (bytesReceived == 0)
                {
                    // Client closing the socket
                    state.ClientSocket.Close();
                }
                else
                {
                    if (bytesReceived < state.Count)
                    {
                        state.SendReceiveOffset += bytesReceived;
                        state.ClientSocket.BeginReceive(state.Buffer, state.SendReceiveOffset, state.Count - state.SendReceiveOffset, SocketFlags.None, OnReceive, state);
                    }
                    else
                    {
                        switch (state.ClientState)
                        {
                        case ClientState.ReceivingLength:
                            Console.WriteLine("Received {0} bytes", state.Count);
                            this.AddReceivedBytes(state);
                            int length = Formatting.BytesToSize(state.Buffer, 0);
                            Console.WriteLine("Length: {0}", length);
                            state.ClientState       = ClientState.ReceivingData;
                            state.Buffer            = new byte[length];
                            state.SendReceiveOffset = 0;
                            state.Count             = length;
                            state.ClientSocket.BeginReceive(state.Buffer, 0, length, SocketFlags.None, OnReceive, state);
                            break;

                        case ClientState.ReceivingData:
                            Console.WriteLine("Received {0} bytes", state.Count);
                            this.AddReceivedBytes(state);
                            state.ClientState       = ClientState.SendingLength;
                            state.SendReceiveOffset = 0;
                            state.Data   = state.Buffer;
                            state.Buffer = new byte[4];
                            Formatting.SizeToBytes(state.Count, state.Buffer, 0);
                            state.Count = 4;
                            state.ClientSocket.BeginSend(state.Buffer, 0, 4, SocketFlags.None, OnSend, state);
                            break;
                        }
                    }
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
        }
 void AddReceivedBytes(SendReceiveState state)
 {
     byte[] received = new byte[state.Count];
     Array.Copy(state.Buffer, received, state.Count);
     this.receivedBytes.Add(received);
 }
示例#6
0
 void AddReceivedBytes(SendReceiveState state)
 {
     byte[] received = new byte[state.Count];
     Array.Copy(state.Buffer, received, state.Count);
     this.receivedBytes.Add(received);
 }
示例#7
0
 void OnSend(IAsyncResult asyncResult)
 {
     SendReceiveState state = (SendReceiveState)asyncResult.AsyncState;
     try
     {
         int bytesSent = state.ClientSocket.EndSend(asyncResult);
         if (bytesSent == 0)
         {
             // Client closing the socket
             state.ClientSocket.Close();
         }
         else
         {
             if (bytesSent < state.Count)
             {
                 state.SendReceiveOffset += bytesSent;
                 state.ClientSocket.BeginSend(state.Buffer, state.SendReceiveOffset, state.Count - state.SendReceiveOffset, SocketFlags.None, OnSend, state);
             }
             else
             {
                 switch (state.ClientState)
                 {
                     case ClientState.SendingLength:
                         Console.WriteLine("Sent {0} bytes for the length", state.Count);
                         state.ClientState = ClientState.SendingData;
                         state.Buffer = state.Data;
                         state.SendReceiveOffset = 0;
                         state.Count = state.Data.Length;
                         state.ClientSocket.BeginSend(state.Buffer, 0, state.Count, SocketFlags.None, OnSend, state);
                         break;
                     case ClientState.SendingData:
                         Console.WriteLine("Sent {0} bytes for the data", state.Count);
                         Debugging.PrintBytes(state.Buffer, state.Count);
                         SendReceiveState receiveState = new SendReceiveState
                         {
                             Server = this,
                             ClientState = SimpleEchoServer.ClientState.ReceivingLength,
                             ClientSocket = state.ClientSocket,
                             Buffer = new byte[4],
                             SendReceiveOffset = 0,
                             Count = 4,
                         };
                         Formatting.SizeToBytes(state.Count, state.Buffer, 0);
                         state.ClientSocket.BeginReceive(state.Buffer, 0, 4, SocketFlags.None, OnReceive, receiveState);
                         break;
                 }
             }
         }
     }
     catch (ObjectDisposedException)
     {
     }
     catch (SocketException e)
     {
         Console.WriteLine("SocketException: {0}", e);
     }
 }