可能重复:
C# Begin/EndReceive - how do I read large data?
C# Async Sockets Server Receive Problems
我有在套接字(TCP)上编写的异步客户端和服务器应用程序。例如,当我从服务器发送300000字节时,我只在客户端收到一部分字节。然后我再次调用Receive方法并接收剩余的数据。虽然Receive方法必须接收所有数据。有什么问题?
这里是客户端Receive方法的代码:
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());
}
}