socket编程,高并发如何避免 10061 错误? 我写了一个 Socket。在线程为 1000 的测试下,平均10次测试出现8次 SocketException 错误,错误代码位 10061,目标服务器拒绝。该怎么处理这个问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 而在线程 100 或 500 的情况下,基本没有出现这个问题。我一开始以为是服务端侦听队列超出了。我尝试这样也出错: this._Listener.Start(5000); 普通的 Socket 应用程序。在监听的时候我是在一条独立的线程。还需要异步吗? private void ListenerThreadProc(object state) { this._Listener.Start(int.MaxValue); this.SwitchState(CommunicationState.Opened); while(Continue) { if(!this._Listener.Pending()) continue;//- 避免关闭连接时,AcceptTcpClient 引发的 10004 错误。 try { TcpClient client = this._Listener.AcceptTcpClient(); RemotingShare.SetKeepAlive(client.Client); lock(this.ClientSyncObject) { this._Clients.Add(client); } Thread t = new Thread(ClientThreadProc); t.IsBackground = true; t.Start(client); } catch(Exception e) {//- 网络掉线等诸多原因 this.Dispose(); this.SwitchFailedState(e); break; } } } 我试过了。改成一下代码,仍然一样的结果。 private void OpenMode2() { this._Listener.Start(int.MaxValue); this.SwitchState(CommunicationState.Opened); this._Listener.BeginAcceptTcpClient(BeginAcceptTcpClient, null); } private void BeginAcceptTcpClient(IAsyncResult ar) { try { TcpClient client = this._Listener.EndAcceptTcpClient(ar); RemotingShare.SetKeepAlive(client.Client); lock(this.ClientSyncObject) { this._Clients.Add(client); } Thread t = new Thread(ClientThreadProc); t.IsBackground = true; t.Start(client); } catch(Exception e) {//- 网络掉线等诸多原因 this.Dispose(); this.SwitchFailedState(e); } if(this.Continue) this._Listener.BeginAcceptTcpClient(BeginAcceptTcpClient, null); } 我有一份这方面的资料 LZ+我Q 453367672 你拿去研究下 MSDN上的说法:(对端端口已关闭或没有运行服务程序) --10061错误 但这个说法是说不过去的。测试到达一定的程度,便会抛出这个错误。我尝试了一下,得出这样的结论:1、开启服务器2、客户端测试1000连接,某个连接抛出 10061 错误后,服务端抛出错误客户端Socket错误。3、开启另外一个客户端,测试10连接,服务端正常。因此推断:由于并发数太高,单一应用程序无法承受 1000线程带来的连接损耗而抛出 10061 错误? 由于目标机器积极拒绝,无法连接1.如果是采用TCP/udp协议进行连接,检查windows防火墙是否开放相应SocketTCP/udp端口;简单的检测方法是关闭windows防火墙后再试;2.检查防火墙软件是否开放相应SocketTCP/udp端口;简单的检测方法是关闭防火墙软件后再试;3.如果服务器端和客户端均在本机上运行,则将相应的 serverIP="127.0.0.1",serveraddress="127.0.0.1";服务器端侦听:listener = new TcpListener(IPAddress.Parse(serverIP), listenport);listener.Start();客户端与服务器建立连接:clientsocket = new TcpClient(serveraddress, serverport);4.如果服务器运行在局域网或广域网内,则将相应的serverIP,serveraddress设为本机所在局域网或广域网上的IP;注意 serverport==listenport;//这个是以前遇到这种错误的总结 我怀疑是正解。我修改成 try { this._client.Connect(this._serverIPEndPoint); goto SuccessedLabel; } catch(SocketException) { } this._client.Connect(this._serverIPEndPoint);//Try again SuccessedLabel:就不会出现这个问题了。甚至还可以修改成3次尝试。如果失败则认定服务器无法连接。 winform:怎么屏蔽网页警告信息窗口? C# 求高手解决文件夹加密问题 如何在类中调用主程序的变量 求问Array.Clone()浅表复制问题 ???关于winform的datagrid的一些问题?!!分不够可以加!!! C#中用什么方法实现数组参数啊--在线 求助内存表操作! ¥$@請問flash Mx 與XML 結合做button menu? 怎样计算时间差 dataView的重要问题 批量更新与数据查询。 BackgroundWorker的一个小问题,RunWorkerCompleted怎么接受异常
这样也出错: this._Listener.Start(5000);
{
this._Listener.Start(int.MaxValue);
this.SwitchState(CommunicationState.Opened);
while(Continue)
{
if(!this._Listener.Pending()) continue;//- 避免关闭连接时,AcceptTcpClient 引发的 10004 错误。
try
{
TcpClient client = this._Listener.AcceptTcpClient();
RemotingShare.SetKeepAlive(client.Client);
lock(this.ClientSyncObject)
{
this._Clients.Add(client);
}
Thread t = new Thread(ClientThreadProc);
t.IsBackground = true;
t.Start(client);
}
catch(Exception e)
{//- 网络掉线等诸多原因
this.Dispose();
this.SwitchFailedState(e);
break;
}
} }
我试过了。改成一下代码,仍然一样的结果。 private void OpenMode2()
{
this._Listener.Start(int.MaxValue);
this.SwitchState(CommunicationState.Opened);
this._Listener.BeginAcceptTcpClient(BeginAcceptTcpClient, null);
} private void BeginAcceptTcpClient(IAsyncResult ar)
{
try
{
TcpClient client = this._Listener.EndAcceptTcpClient(ar); RemotingShare.SetKeepAlive(client.Client);
lock(this.ClientSyncObject)
{
this._Clients.Add(client);
}
Thread t = new Thread(ClientThreadProc);
t.IsBackground = true;
t.Start(client);
}
catch(Exception e)
{//- 网络掉线等诸多原因
this.Dispose();
this.SwitchFailedState(e);
}
if(this.Continue) this._Listener.BeginAcceptTcpClient(BeginAcceptTcpClient, null);
}
1、开启服务器
2、客户端测试1000连接,某个连接抛出 10061 错误后,服务端抛出错误客户端Socket错误。
3、开启另外一个客户端,测试10连接,服务端正常。因此推断:由于并发数太高,单一应用程序无法承受 1000线程带来的连接损耗而抛出 10061 错误?
1.如果是采用TCP/udp协议进行连接,检查windows防火墙是否开放相应SocketTCP/udp端口;
简单的检测方法是关闭windows防火墙后再试;
2.检查防火墙软件是否开放相应SocketTCP/udp端口;
简单的检测方法是关闭防火墙软件后再试;
3.如果服务器端和客户端均在本机上运行,则将相应的 serverIP="127.0.0.1",serveraddress="127.0.0.1";
服务器端侦听:
listener = new TcpListener(IPAddress.Parse(serverIP), listenport);
listener.Start();
客户端与服务器建立连接:
clientsocket = new TcpClient(serveraddress, serverport);
4.如果服务器运行在局域网或广域网内,则将相应的
serverIP,serveraddress设为本机所在局域网或广域网上的IP;
注意 serverport==listenport;//这个是以前遇到这种错误的总结
{
this._client.Connect(this._serverIPEndPoint);
goto SuccessedLabel;
}
catch(SocketException) { }
this._client.Connect(this._serverIPEndPoint);//Try again SuccessedLabel:
就不会出现这个问题了。甚至还可以修改成3次尝试。如果失败则认定服务器无法连接。