¿Cómo debería uno derribar un impulso :: asio :: ip :: udp :: socket?

StackOverflow https://stackoverflow.com/questions/1222637

  •  10-07-2019
  •  | 
  •  

Pregunta

He leído la referencia de boost asio, revisé el tutorial y miré algunos de los ejemplos. Aún así, no puedo ver cómo se debe derribar un zócalo:

  1. ¿Debería llamar a close () o esto lo hace el destructor del socket?
  2. ¿Cuándo debo llamar a shutdown ()
  3. ¿Cuáles son los efectos del apagado ()? Soy consciente de que " Desactiva los envíos o las recepciones " ;, pero ¿cómo se hace esto? ¿Qué puedo esperar si envío o recibo usando el socket después de que se ha deshabilitado?
  4. ¿Qué errores puedo esperar de close ()
¿Fue útil?

Solución

Dado que esta es una pregunta múltiple, haré todo lo posible para responder cada parte a su entera satisfacción:

1) Según mi experiencia con los sockets ASIO, el destructor se encarga de cerrar el socket. Sin embargo, solo he tratado con sockets TCP. La mejor manera de verificar esto es simplemente mirar el código del destructor para ver si hace algo parecido a un cierre. Sé que el código Boost puede ser un poco difícil de recorrer, por lo que podría ser más fácil simplemente crear un pequeño programa de muestra que abra un socket UDP y luego lo destruya. De esa manera, puede recorrer el código en un depurador para seguir la lógica.

Dado que los diseñadores de Boost tomaron esto en cuenta para los sockets TCP, me resulta difícil imaginar que no harían lo mismo para los sockets UDP.

2) Llame a shutdown () solo cuando considere que es necesario evitar que cualquier código realice una futura recv y / o send en la toma. Por lo general, no se requiere, aunque he visto que se usa en sockets TCP para forzar al socket a enviar un RST cuando está cerrado (a diferencia del apagado predeterminado `` agraciado '' donde se procesan los envíos pendientes ).

3) Puede pensar en los enchufes como una forma de comunicación de dos canales: uno para leer, el otro para enviar. Puede apagar uno independientemente del otro, y puede continuar usando un canal cuando el otro está apagado (es decir, aún puede recibir después del apagado para enviar y viceversa). Cerrar un socket es idéntico a llamar al apagado tanto en recv como en envío.

Cerrar por recv simplemente evita que su código lea más datos. Si intenta hacerlo, recibirá un error de socket. Del mismo modo, si el otro lado de la conexión intenta enviarle datos, recibirá un error (perdón por cambiar al mundo TCP nuevamente, pero creo que un RST recibe respuesta del remitente).

Al cerrar el envío de la misma manera, se evita que su código envíe más datos. Si la memoria me sirve correctamente, esto se ve idéntico a lo que sucede cuando cierra un socket (se envía un paquete de longitud cero para indicar al otro lado que el canal en particular se ha cerrado). Cualquier intento futuro de enviar devolverá un error.

4) Tendrá que revisar sus documentos para saber con certeza. MSDN le dará una muy buena indicación, aunque no sé si lo consideraría autoritario.

Otros consejos

De los ejemplos dados en el sitio web de Boost, parece que debería usar close (). Por ejemplo, mira este:

void connection::stop()
{
  socket_.close();
}

Tomado de esta dirección: Servidor HTTP

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top