"Lograr la reutilización del puerto de socket en C #" y "UDP Una operación de bloqueo fue interrumpida por la llamada a WSACancelBlockingCall. "problema

URL original: http://www.cnblogs.com/graypigeon/archive/2012/02/18/2357176.html

1. Problema: en la comunicación de Socket, a menudo tenemos que compartir un puerto con varios clientes, pero esto a menudo informa un error, porque normalmente un puerto solo se puede vincular una vez, pero es problemático liberarlo, por lo que aún necesitamos realizar el intercambio de puertos Si lo hace, no es necesario realizar una y otra vez.

  2. Realice la multiplexación de puertos:

     Enlace normal:

//定义网络地址,连接类型与网络协议并绑定本地IP与端口
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr), 2012);
          
            socket.Bind(ipPoint);
Agregue una función común: SetSocketOption
//定义网络地址,连接类型与网络协议并绑定本地IP与端口
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr), 2012);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);  //SocketOptionName.ReuseAddress是关键
            socket.Bind(ipPoint); 

Esto no reportará el error de ocupar el mismo puerto


Para el problema de interrupción: la razón es probablemente porque cuando cierra el socket, socket.Receive (buffer); todavía está en estado de lectura.

A:

if (socket.Poll(-1,SelectMode.SelectRead))
                       {                      
                           if ( ( dataLength = socket.Receive(buffer) ) > 0)
                           {
                               Analyer(Encoding.ASCII.GetString(buffer, 0, dataLength));
                           }
                       }



Supongo que te gusta

Origin blog.csdn.net/youarenotme/article/details/78048268
Recomendado
Clasificación