Comunicación udp basada en Linux

Prefacio

Escribí sobre la comunicación tcp antes, y ahora escribí sobre la comunicación udp. De hecho, los códigos son casi los mismos. Lo importante es que tenemos que tener claro la diferencia entre la comunicación tpc y la udp, y lo encontré en el Internet.

La diferencia entre tcp y udp

1. La conexión es diferente de
la orientada a la conexión TCP (si realiza una llamada, primero debe marcar el número du para establecer una conexión). Zhi
UDP no tiene conexión, es decir, no es necesario establecer una conexión con dao antes de enviar datos.
2. La diferencia en seguridad
TCP brinda servicios confiables, los datos transmitidos a través de la conexión TCP no tienen errores, pérdidas, repeticiones y llegan en orden.
UDP hace todo lo posible para entregar, es decir, no se garantiza una entrega confiable.
3. La diferencia en la
eficiencia de transmisión La eficiencia de transmisión del TCP es relativamente baja.
UDP tiene una alta eficiencia de transmisión y es adecuado para transmisión de alta velocidad y comunicación en tiempo real o comunicación de transmisión.
4. La diferencia en el número de objetos de
conexión Las conexiones TCP solo pueden ser punto a punto y uno a uno.
UDP admite comunicaciones interactivas uno a uno, uno a varios, varios a uno y varios a varios.
para resumir

  • Tcp realiza una transmisión confiable a través de suma de verificación, control de retransmisión, identificación del número de serie, ventana deslizante y respuesta de confirmación. Por ejemplo, el control de retransmisión cuando se pierde el paquete, también se puede realizar el control de secuencia de los subpaquetes fuera de orden.
  • UDP tiene un mejor rendimiento en tiempo real, mayor eficiencia de trabajo que TCP y es adecuado para transmisión de alta velocidad y comunicación en tiempo real o comunicación de difusión.
  • TCP requiere más recursos del sistema, mientras que UDP requiere menos recursos del sistema.
  • El protocolo popular en Internet es el protocolo TCP / IP, que tiene definiciones exactas para puertos inferiores a 1024 y corresponden a algunos servicios comunes en Internet. Estos servicios comunes se pueden dividir en dos tipos: puerto TCP (orientado a la conexión) y puerto UDP (sin conexión).
  • TCP está orientado a la conexión y tiene una confiabilidad relativamente alta. Algunos servicios con requisitos más altos generalmente usan este protocolo, como FTP, Telnet, SMTP, HTTP, POP3, QQ, etc., mientras que UDP está orientado a la conexión y usa este protocolo. Común los servicios incluyen DNS, SNMP, etc.

A continuación se explica el protocolo correspondiente a TCP y el protocolo correspondiente a UDP:
Protocolo correspondiente a TCP:
(1) FTP: define el protocolo de transferencia de archivos, utilizando el puerto 21.
(2) Telnet: un puerto utilizado para el inicio de sesión remoto, utilizando el puerto 23, los usuarios pueden conectarse de forma remota a la computadora como si fueran propios y pueden proporcionar servicios de comunicación basados ​​en el modo DOS.
(3) SMTP: protocolo de transferencia de correo, utilizado para enviar correo. El servidor abre el puerto 25.
(4) POP3: Corresponde a SMTP, y se utiliza POP3 para recibir correo. El protocolo POP3 usa el puerto 110.
(5) HTTP: es el protocolo de transferencia para transferir hipertexto desde el servidor web al navegador local.
Protocolos correspondientes a UDP:
(1) DNS: se utiliza para el servicio de resolución de nombres de dominio, que convierte las direcciones de los nombres de dominio en direcciones IP. DNS usa el puerto 53.
(2) SNMP: el protocolo de administración de red simple, que usa el puerto 161, se usa para administrar el equipo de red. Como hay muchos dispositivos de red, el servicio sin conexión tiene sus ventajas.
(3) TFTP (Trival File Transfer Protocal), un protocolo de transferencia de archivos simple, que utiliza servicios UDP en el conocido puerto 69.

lado del servidor

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#define SERVER_PORT 60003
#define IP "192.168.69.129"
int main()
{
    
    
    int socketfd;
    int ret;
    int RecvLen;
    char RecvBuff[256];
    char SendBuff[256];

    struct sockaddr_in ser_addr, client_addr;
    
    socketfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (0 > socketfd)
    {
    
    
        printf("can't create socket\n");
        return -1;
    }

    memset(&ser_addr, 0, sizeof(struct sockaddr_in));
    ser_addr.sin_family = AF_INET;
    #if 0
    ser_addr.sin_addr.s_addr = inet_addr(IP);    
    #else 
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    #endif
    ser_addr.sin_port = htons(SERVER_PORT);
    
    ret = bind(socketfd, (struct sockaddr *)&ser_addr,sizeof(struct sockaddr));
    if (0 > ret)
    {
    
    
        printf(" Bind fail\n");
        return -1;
    }
    
    int AddrLen = sizeof(struct sockaddr);    
    while(1)
    {
    
    
        memset(RecvBuff, 0, sizeof(RecvBuff));
        RecvLen = recvfrom(socketfd, RecvBuff, sizeof(RecvBuff), 0,
            (struct sockaddr *)&ser_addr, &AddrLen);
        printf("recv: %s\n",RecvBuff);
        memset(SendBuff, 0, sizeof(SendBuff));
        printf("server-> :");
        gets(SendBuff);
        sendto(socketfd, SendBuff, sizeof(SendBuff), 0, (struct sockaddr*)
            &ser_addr, sizeof(struct sockaddr));
    }
    
    close(socketfd);
    return 0;
}

En el código anterior, utilicé la ip conocida en Linux como el establecimiento, usé #if y #else para seleccionar, si necesita especificar la ip, puede modificarla, el código se puede compilar y conectar directamente de forma predeterminada

lado del cliente

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#define IP "192.168.1.2"
#define SERVER_PORT 60003
int main()
{
    
    
    int socketfd;
    int ret;
    int RecvLen = 0;
    char RecvBuff[256];
    char SendBuff[256];

    struct sockaddr_in ser_addr, client_addr;
    
    socketfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (0 > socketfd)
    {
    
    
        printf("can't create socket\n");
        return -1;
    }

    memset(&ser_addr, 0, sizeof(struct sockaddr_in));
    client_addr.sin_family = AF_INET;
    #if 0
    client_addr.sin_addr.s_addr = inet_addr(IP);    
    #else 
    client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    #endif
    client_addr.sin_port = htons(SERVER_PORT);
    
    memset(SendBuff, 0, sizeof(SendBuff));    
    memcpy(SendBuff, "hello word!\n", 100);
    sendto(socketfd, SendBuff, sizeof(SendBuff), 0, (struct sockaddr *)
        &client_addr, sizeof(struct sockaddr));    
    
    int AddrLen = sizeof(struct sockaddr);
    while(1)
    {
    
    
        memset(RecvBuff, 0, sizeof(RecvBuff));
        RecvLen = recvfrom(socketfd, RecvBuff, sizeof(RecvBuff), 0,
           (struct sockaddr *)&client_addr, &AddrLen);
        printf("recv: %s\n",RecvBuff);
        memset(&SendBuff, 0, sizeof(SendBuff));
        printf("client-> :");
        gets(SendBuff);
        sendto(socketfd, SendBuff, sizeof(SendBuff), 0, (struct sockaddr *)
            &client_addr, sizeof(struct sockaddr));
    }
    
    close(socketfd);
    return 0;
}

Al igual que en el lado del servidor, se puede personalizar y modificar. Al establecer una conexión, comprenda el bloqueo y el no bloqueo de la función, lo que favorece la resolución y el análisis de problemas.

resultado

Inserte la descripción de la imagen aquíSi tiene alguna pregunta o pregunta, espero que todos puedan aprender y progresar juntos.

Supongo que te gusta

Origin blog.csdn.net/weixin_42271802/article/details/109012734
Recomendado
Clasificación