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());
}
}
精彩评论