我写了一个 Socket。在线程为 1000 的测试下,平均10次测试出现8次 SocketException 错误,错误代码位 10061,目标服务器拒绝。
该怎么处理这个问题?

解决方案 »

  1.   

    而在线程 100 或 500 的情况下,基本没有出现这个问题。我一开始以为是服务端侦听队列超出了。我尝试
    这样也出错:            this._Listener.Start(5000);
      

  2.   

    普通的 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;
                    }
                }        }
      

  3.   


    我试过了。改成一下代码,仍然一样的结果。        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);
            }
      

  4.   

    我有一份这方面的资料 LZ+我Q 453367672 你拿去研究下
      

  5.   

    MSDN上的说法:(对端端口已关闭或没有运行服务程序) --10061错误
      

  6.   

    但这个说法是说不过去的。测试到达一定的程度,便会抛出这个错误。我尝试了一下,得出这样的结论:
    1、开启服务器
    2、客户端测试1000连接,某个连接抛出 10061 错误后,服务端抛出错误客户端Socket错误。
    3、开启另外一个客户端,测试10连接,服务端正常。因此推断:由于并发数太高,单一应用程序无法承受 1000线程带来的连接损耗而抛出 10061 错误?
      

  7.   

    由于目标机器积极拒绝,无法连接
    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;//这个是以前遇到这种错误的总结
      

  8.   

    我怀疑是正解。我修改成                 try
                    {
                        this._client.Connect(this._serverIPEndPoint);
                        goto SuccessedLabel;
                    }
                    catch(SocketException) { }
                    this._client.Connect(this._serverIPEndPoint);//Try again            SuccessedLabel:
    就不会出现这个问题了。甚至还可以修改成3次尝试。如果失败则认定服务器无法连接。