¿Fread solo funciona con una conexión TCP y no con UDP?

fread () requiere un puntero FILE como argumento. Puede crear un puntero FILE a partir de un socket utilizando fdopen (), pero ese socket debe ser un socket de tipo de flujo (SOCK_STREAM) que es TCP. Un socket que usa UDP se crea usando SOCK_DGRAM y no es adecuado para API que requieren un comportamiento de transmisión.

Tenga en cuenta que los sockets TCP y UDP son bidireccionales, puede leer y escribir en un socket ya sea SOCK_STREAM o SOCK_DGRAM. La diferencia es que al recibir datos en un socket de flujo, el socket se llenará hasta el búfer de recepción de la aplicación y retendrá el resto hasta la próxima llamada de recepción (er … recv ()). Con SOCK_DGRAM, el búfer de recepción de la aplicación se llenará con el contenido del datagrama y cualquier exceso de datos que no quepa en el búfer puede descartarse.

Hay muchos artículos sobre cómo no es una buena práctica poner un socket de flujo en una estructura FILE. Está permitido, pero el almacenamiento en búfer de llamadas que usan FILE puede ser ineficiente cuando se combina con el almacenamiento en búfer de varias implementaciones de TCP (por ejemplo, el algoritmo de Nagle).

En un sentido general, sí. TCP es una conexión inherentemente bidireccional, aunque a menudo se usa unidireccional. UDP es una conexión unidireccional: le gritas a tu receptor previsto, esperando que lo reciba. Pero no hay un canal posterior, es enviar y olvidar. Así que no hay forma de leer.

Es mejor usar llamadas de lectura / escritura de nivel inferior con sockets.