2

Possible Duplicates:
C# Begin/EndReceive - how do I read large data?
C# Async Sockets Server Receive Problems

I have asynchronous client and server applications written on Sockets(TCP). When I send, for example, 300000 bytes from the server, I receive only a part of them on the client. And then I call the Receive method again and receive the rest of the data. Although the Receive method has to receive all the data. What is the problem?

Here the code of the Receive method on client side:
 public class ConnectionInfo
 {
        public Socket _socketReply;
        public Socket _SocketCommand;
        public byte[] _bufferSendReply;
        public byte[] _bufferReceive;
        public byte[] _bufferSendCommand;
        public int _numberBytesSentReply = 0;
        public int _numberBytesSentCommand = 0;
        public List<byte> _fullBufferReceive;
        public uint _id = 0;

        public ConnectionInfo()
        {
            _fullBufferReceive = new List<byte>();
        }
 }

 private void RecieveCallback(IAsyncResult asyncResult)
    {
        ConnectionInfo connection = (ConnectionInfo)asyncResult.AsyncState;
        try
        {
            int bytesRead = connection.Socket.EndReceive(asyncResult);

            if (bytesRead > 0)
            {
                for (int i = 0; i < bytesRead; i++)
                    connection.FullBufferReceive.Add(connection.BufferReceive[i]);
                if (bytesRead == connection.BufferReceive.Length)
                {
                    connection.Socket.BeginReceive(connection.BufferReceive, 0, connection.BufferReceive.Length, 0,
                                                   new AsyncCallback(RecieveCallback), connection);
                    Console.WriteLine("Bytes recieved -- " + bytesRead + " by " + connection.Id);
                }
                else
                {
                    Console.WriteLine("All -- Bytes -- recieved " + bytesRead + " by " + connection.Id);

                    ConnectionInfo NewCI = new ConnectionInfo(connection);
                    Recieve(connection);
                    _serverController.SpreadReceivedData(NewCI);
                }
            }
            else
                CloseConnection(connection);
        }
        catch (ObjectDisposedException ode)
        {
            CloseConnection(connection);
            Console.WriteLine("ObjectDisposedException: " + ode.Message);
        }
        catch (SocketException exc)
        {
            CloseConnection(connection);
            Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
        }
        catch (Exception e)
        {
            CloseConnection(connection);
            Console.WriteLine(e.ToString());
        }
    }

 public void Recieve(ConnectionInfo connection)
 {
        try
        {
            connection.BufferReceive = new byte[Settings.bufferLength];
            connection.FullBufferReceive.Clear();
            connection.NumberBytesSentReply = 0;

            connection.Socket.BeginReceive(connection.BufferReceive, 0, connection.BufferReceive.Length, 0,
                                          new AsyncCallback(RecieveCallback), connection);
        }
        catch (SocketException exc)
        {
            CloseConnection(connection);
            Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
Community
  • 1
  • 1
Dav
  • 43
  • 3
  • 2
    Aw man, not this again. *This is by design and documented.* Hmm, where's that dupe... – R. Martinho Fernandes May 11 '11 at 16:23
  • I understood. I call BeginSend from the server, but its parametars are Int32 type. So, to send all data i'll need call BeginSend in the loop while sending data will not be equal 0. – Dav May 11 '11 at 16:51

0 Answers0