¿Cómo puedo verificar que un paquete TCP haya recibido un ACK en C #?

Después de enviar algunos datos tcp con los métodos de locking / no locking como:

Socket.Send() or Socket.SendAsync() 

¿Cómo puedo saber que mis datos han recibido un mensaje ACK?

¿Puede .NET saber si los datos TCP se han enviado correctamente?

La única forma de saberlo con seguridad es implementar algún tipo de acuse de recibo a nivel de aplicación. El paquete “ACK” de nivel TCP no está expuesto en absoluto al nivel de la aplicación, por lo que tiene que usar algo más que eso.

Haces que el otro extremo responda a ello.

Incluso si TCP lo ha activado, si el extremo receptor finaliza (por buenas o malas razones) antes de procesar el mensaje y actuar sobre él, todavía no lo sabe, por lo que la única forma de saberlo es que el otro extremo se lo indique.

Esta información no está disponible en las bibliotecas de clases de .net. Tuve el mismo tipo de consideraciones cuando comencé a trabajar en este escáner de puertos en C #. He utilizado un envoltorio .NET para libpcap (después de instalar el controlador correspondiente), SharpPcap ( http://sourceforge.net/projects/sharppcap/ ), para obtener este tipo de información. Los paquetes ACK se obtienen a través de la interfaz de SharpPcap (invocando la interfaz libpcap nativa de forma transparente).

Mi aplicación es NScanner Port Scanner / Sweeper y puede encontrar el código en codeplex, refiriéndome a mi uso simple de la biblioteca mencionada anteriormente ( http://nscanner.codeplex.com/ ).

Espero haberte ayudado.

“Estoy tratando de concentrarme en cómo puede saber cuándo sus datos han sido aceptados por el otro lado de la conexión”.

Creo que debe tener en cuenta qué tipo de protocolo de capa de aplicación va a implementar y qué impacto tiene esto en el rendimiento de la aplicación.

Tome HTTP como ejemplo de un protocolo “Streaming like”. Un servidor publica un flujo de datos a un cliente. No hay más “ACK” de la capa de aplicación adicional y al servidor no le importa cuándo y cómo llega exactamente su flujo de datos. Esto es muy eficaz en enlaces de alta latencia.

Ahora compara esto con SMB! En lugar de transmitir un archivo, los datos se dividen en bloques. Cada bloque de datos transferido con éxito se ejecuta en la capa de aplicación. Esto le da más control, sin embargo, efectivamente elimina el protocolo en las redes WAN (consulte el “Producto de retardo de ancho de banda”).

Teniendo esto en cuenta, puede crear su propio diseño para su protocolo personalizado.

Recomiendo usar Pcap.Net .

Puede rastrear fácilmente los paquetes usando esta biblioteca en C # y luego verificar fácilmente los valores de los paquetes.

También puede fácilmente construir y enviar paquetes.

Si está realmente seguro de que necesita conocer los detalles a nivel de paquete de su conexión TCP, además de crear el socket TCP para el envío, necesita que su aplicación use la API winpcap para ver también el tráfico en bruto. Puede instalar un filtro para recibir solo paquetes relevantes para la IP particular, combinación de puertos que determina su lado remoto.

Hay un par de proyectos por ahí creando envolturas .NET para libpcap, por ejemplo aquí

La capa TCP seguirá reenviando el paquete hasta que reciba un ACK exitoso.

El envío se bloqueará hasta que esto suceda: SendAsync no se bloqueará, y puede continuar procesando otras cosas mientras la capa TCP se encarga de enviar el paquete.