客户端重启,服务如何重新监听?

takpod 2018-04-17 11:19:12

//服务器端     初始化
sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sock.Bind(new IPEndPoint(ip, port));
sock.Listen(2);

//线程里
Socket client = sock.Accept(); // 为客户端建立服务连接 并等待连接

while(true)
{
client.Receive(buffer, buffer.Length, SocketFlags.None);
//当客户关闭时上面这句会抛出异常,我应该怎么处理才可以重新调用client.Receive来接受呢?
//调用client.Close()之后 重新new一个 client再绑定还是会提示IP套接字只能用一次
}

...全文
482 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
takpod 2018-04-17
  • 打赏
  • 举报
回复
引用 1 楼 xian_wwq 的回复:
lz对Server侧的侦听机制理解有误 客户端异常,并不会影响已有的侦听 同步是这样的

    IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
    Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    
    socket.Bind(localEndPoint);       
    socket.Listen(20);        
    while (true)        
    { 
          Socket connection = socket.Accept(); 
        // 收发代码略 ……        
    } 
很明显,同步方式执行socket.Accept()的时候,程序被阻塞,直到有新的连接请求的时候程序才会执行下一句。 要避免阻塞,推荐使用异步方式

 IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);        
     Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
     socket.Bind(localEndPoint);       
     socket.Listen(20);         
     //启动异步Accept        
     socket.BeginAccept(AcceptCallBack, socket);     

     //异步接收回调
     void AcceptCallBack(IAsyncResult ar)    
     { 
        Socket socket = ar.AsyncState as Socket        //结束异步Accept并获已连接的Socket        
        Socket connection = socket.EndAccept(ar);      // 通过connection收发操作的代码略……                 
      
        //继续异步Accept,保证可以Accept后续的接入
        socket.BeginAccept(AcceptCallBack, socket);     
     }

谢谢你 我要的就是阻塞模式,我的问题已经解决 还是很感谢你
xian_wwq 2018-04-17
  • 打赏
  • 举报
回复
lz对Server侧的侦听机制理解有误 客户端异常,并不会影响已有的侦听 同步是这样的

    IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
    Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    
    socket.Bind(localEndPoint);       
    socket.Listen(20);        
    while (true)        
    { 
          Socket connection = socket.Accept(); 
        // 收发代码略 ……        
    } 
很明显,同步方式执行socket.Accept()的时候,程序被阻塞,直到有新的连接请求的时候程序才会执行下一句。 要避免阻塞,推荐使用异步方式

 IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);        
     Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
     socket.Bind(localEndPoint);       
     socket.Listen(20);         
     //启动异步Accept        
     socket.BeginAccept(AcceptCallBack, socket);     

     //异步接收回调
     void AcceptCallBack(IAsyncResult ar)    
     { 
        Socket socket = ar.AsyncState as Socket        //结束异步Accept并获已连接的Socket        
        Socket connection = socket.EndAccept(ar);      // 通过connection收发操作的代码略……                 
      
        //继续异步Accept,保证可以Accept后续的接入
        socket.BeginAccept(AcceptCallBack, socket);     
     }

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧