【发布时间】:2011-12-20 11:20:59
【问题描述】:
我目前有一个使用 TCP 套接字连接用户和发送/接收数据的 Windows 应用程序。当一个新用户尝试连接而其他几个用户(从不一样数量的用户)已经连接并接收数据时,应用程序崩溃。我的应用程序需要从一个人接收数据并将其发送给多个用户。应用程序每秒接收几次数据。
我的代码在出错之前所做的最后一件事是尝试将新客户端添加到列表中。似乎在尝试连接新用户时会干扰尝试发送的数据。
private static void EndAccept(IAsyncResult ar)
{
Listener_Socket = (Socket)ar.AsyncState;
ClientsList.Add(Listener_Socket.EndAccept(ar));
Listener_Socket.BeginAccept(new AsyncCallback(EndAccept), Listener_Socket);
...
AsyncCallback receiveData = new AsyncCallback(MyServer.OnReceivedData);
}
事件查看器错误:
应用程序:xxxxxxxxxxxx.exe 框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.InvalidOperationException 堆栈:在 System.Collections.ArrayList+ArrayListEnumeratorSimple.MoveNext() 在 MyServer.OnRecievedData(System.IAsyncResult) 在 System.Net.LazyAsyncResult.Complete(IntPtr) 在 System.Threading.ExecutionContext.runTryCode(System.Object) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode,System.Object)在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object,布尔值)在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object)在 System.Net.ContextAwareResult.Complete(IntPtr) 在 System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32, UInt32,System.Threading.NativeOverlapped*) 在 System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
OnRecievedData:
private static void OnRecievedData(IAsyncResult ar)
{
SocketClient client = (SocketClient)ar.AsyncState;
byte[] aryRet = client.GetRecievedData(ar);
if (aryRet.Length < 1)
{
client.ReadOnlySocket.Close();
ClientsList.Remove(client);
return;
}
foreach (SocketClient clientSend in ClientsList)
{
if (client != clientSend)
try
{
clientSend.ReadOnlySocket.NoDelay = true;
clientSend.ReadOnlySocket.Send(aryRet);
}
catch
{
clientSend.ReadOnlySocket.Close();
ClientsList.Remove(client);
return;
}
}
client.SetupRecieveCallback();
}
【问题讨论】: