我有一个TCP服务器,它可以异步侦听传入连接.如果只连接一个客户端,一切正常.但是,如果有两个或更多连接,则服务器不会收到第一条消息.当我调试ReceiveCallback函数时,我可以看到服务器获取消息的长度而不是数据.即如果我连接两个客户端并尝试发送第一条消息:“hello”,服务器获取:received = 5; buffer = / 0/0/0/0/0,因此不显示任何内容.在同一客户端的第二条消息中,服务器获取数据.
这就是我的服务器的样子:
private void StartServer()
{
try
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 3333));
serverSocket.Listen(100);
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void AcceptCallback(IAsyncResult ar)
{
try
{
Socket clientSocket = serverSocket.EndAccept(ar);
clientSocketList.Add(clientSocket);
AppendToTextBox("ClientConnected");
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int received = 0;
Socket current = (Socket)ar.AsyncState;
received = current.EndReceive(ar);
byte[] data = new byte[received];
if (received == 0)
{
return;
}
Array.Copy(buffer, data, received);
string text = Encoding.ASCII.GetString(data);
AppendToTextBox(text);
buffer = null;
Array.Resize(ref buffer, current.ReceiveBufferSize);
current.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), current);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
最佳答案 请参阅
http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx的示例
您希望更改代码,以便每次调用BeginReceive时它都会分配一个新缓冲区:
Socket clientSocket = serverSocket.EndAccept(ar);
clientSocketList.Add(clientSocket);
AppendToTextBox("ClientConnected");
var buffer = new byte[BUFFER_LENGTH]; // <---
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
每个客户端必须有一个缓冲区.否则,一个客户端可以覆盖另一个客户端使用的缓冲区.