servidor y el cliente basado en UDP: programación del zócalo veintiséis

El artículo anterior, se presentan varios ejemplos de TCP, UDP para, siempre y cuando capaz de entender lo anterior, no es difícil de lograr.

UDP en el servidor y el cliente no está conectado

A diferencia de la UDP TCP, sin el intercambio de datos en el estado conectado, el servidor y el cliente UDP-basado también sin pasar por el proceso de conexión. En otras palabras, no llamada listen () y aceptar () función. sockets UDP sólo para crear los procesos y procedimientos de intercambio de datos.

servidor y el cliente UDP son sólo una toma

TCP, una toma es una relación uno a uno. Para presentar un servicio de 10 clientes, a continuación, además se encarga de vigilar la toma, pero también es necesario para crear una llave de 10. Pero en el UDP, si el servidor o el cliente sólo necesita una toma de corriente. Antes de explicar el principio de los tiempos UDP citó el ejemplo de enviar un paquete, es responsable de enviar una empresa de entrega de paquetes se puede comparar a los sockets UDP, siempre y cuando no es una empresa de mensajería, puede enviar un paquete a cualquier dirección de la misma. Del mismo modo, solamente un socket UDP puede transmitir datos a cualquier host.

Recibir y funciones de transmisión basado en UDP

Una vez que haya creado un socket TCP, no es necesario añadir información de la dirección durante la transmisión de datos, porque socket TCP permanecerá con la otra conexión de socket. En otras palabras, los sockets TCP conocen la información de la dirección de destino. Pero socket UDP no estar conectados, cada transmisión de datos debe añadir la información de dirección de destino, lo que equivale a llenar en la dirección del destinatario antes de paquetes de correo.

La transmisión de datos utilizando la función sendto ():


ssize_t sendto(int sock, void *buf, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen); //Linux
int sendto(SOCKET sock, const char *buf, int nbytes, int flags, const struct sockadr *to, int addrlen); //Windows

Linux y Windows sendto bajo función similar (), el siguiente es las descripciones detalladas de los parámetros:

  • calcetín: toma de corriente para la transmisión de datos UDP;
  • buf: la dirección de memoria intermedia para almacenar en los datos de transmisión;
  • nbytes: con una longitud de los datos de transmisión (en bytes);
  • Banderas: Los parámetros opcionales se pueden transmitir si no hay 0;
  • a: la dirección de la información almacenada con la dirección de destino de sockaddr variables de estructura;
  • addrlen: parámetro de longitud se pasa al valor de la dirección a una estructura variable.


UDP función de envío sendto () función de escritura y enviar TCP () / send () es la mayor diferencia es que, sendto () Función necesidad de pasar la información de dirección de destino para él.

Los datos recibidos utilizando la función recvfrom ():


ssize_t recvfrom(int sock, void *buf, size_t nbytes, int flags, struct sockadr *from, socklen_t *addrlen); //Linux
int recvfrom(SOCKET sock, char *buf, int nbytes, int flags, const struct sockaddr *from, int *addrlen); //Windows

Desde el final de los datos UDP transmitir indefinida, la función recvfrom () se define en la forma de información enviada al lado de recepción, los siguientes dos parámetros:

  • calcetín: un casquillo para recibir datos UDP;
  • buf: Guardar los datos recibidos de amortiguamiento de direcciones;
  • nbytes: número máximo de bytes que se pueden recibir (no exceder el tamaño de la memoria intermedia BUF);
  • Banderas: Los parámetros opcionales se pueden transmitir si no hay 0;
  • a partir de: la información de dirección del extremo transmisor no sockaddr estructura de la dirección de la variable;
  • addrlen: valor de dirección variable de los parámetros de la estructura variables longitud de los salvados.

Sobre la base de la UDP echo servidor / cliente

La siguiente combinación de contenido cliente realización de eco antes. Cabe señalar, difiere UDP de TCP, no hay proceso de solicitud de conexión y aceptación, y por lo tanto no puede haber una distinción clara entre el servidor y el cliente, en un sentido, simplemente porque ofrece un servicio llamado del lado del servidor, espero que los lectores no entienden mal.

El siguiente código se da en Windows, Linux y similares, no los repita.

server.cpp del lado del servidor:


#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll

#define BUF_SIZE 100

int main(){
WSADATA wsaData;
WSAStartup( MAKEWORD(2, 2), &wsaData);

//创建套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);

//绑定套接字
sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr)); //每个字节都用0填充
servAddr.sin_family = PF_INET; //使用IPv4地址
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址
servAddr.sin_port = htons(1234); //端口
bind(sock, (SOCKADDR*)&servAddr, sizeof(SOCKADDR));

//接收客户端请求
SOCKADDR clntAddr; //客户端地址信息
int nSize = sizeof(SOCKADDR);
char buffer[BUF_SIZE]; //缓冲区
while(1){
int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &clntAddr, &nSize);
sendto(sock, buffer, strLen, 0, &clntAddr, nSize);
}

closesocket(sock);
WSACleanup();
return 0;
}

Definiciones:
1) línea de código al crear el zócalo 12, el socket () SOCK_DGRAM segundo parámetro, lo que indica el uso del protocolo UDP.

2) La línea de código 18 se utiliza htonl(INADDR_ANY)para obtener automáticamente una dirección IP.

El uso constante INADDR_ANY obtener automáticamente una dirección IP tiene una ventaja obvia es que cuando el software se instala en un servidor o servidores diferentes se modifica la dirección IP, ya no hay necesidad de volver a compilar los cambios en el código fuente, no tienen que ser introducidos manualmente cuando se inicia el software. Además, si se asigna un ordenador en la pluralidad de direcciones IP (por ejemplo, un enrutador), siempre y cuando el número de puerto es consistente, puede recibir datos de diferentes direcciones IP. Por lo tanto, el servidor de priorizar el uso de INADDR_ANY; y el cliente sino con la parte de la función de servidor, sería no puede utilizarse.

client.cpp cliente:


#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll

#define BUF_SIZE 100

int main(){
//初始化DLL
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);

//创建套接字
SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);

//服务器地址信息
sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr)); //每个字节都用0填充
servAddr.sin_family = PF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons(1234);

//不断获取用户输入并发送给服务器,然后接受服务器数据
sockaddr fromAddr;
int addrLen = sizeof(fromAddr);
while(1){
char buffer[BUF_SIZE] = {0};
printf("Input a string: ");
gets(buffer);
sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));
int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &fromAddr, &addrLen);
buffer[strLen] = 0;
printf("Message form server: %s\n", buffer);
}

closesocket(sock);
WSACleanup();
return 0;
}

Ejecutar el servidor y ejecute el cliente, la salida del cliente es:

Una cadena INPUT:  lenguaje C red china
servidor de formulario Mensaje: lenguaje C red china
la entrada una cadena: c.biancheng.net Fundada en 2012
la forma de mensajes de servidor: fundado en 2012 c.biancheng.net
la entrada una cadena:


función que se puede ver en el código, no server.cpp usada escuchar (), tampoco se utiliza la función client.cpp connect (), ya que UDP no requiere conexión.

Publicado 33 artículos originales · elogios ganado 30 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/baidu_15547923/article/details/90230528
Recomendado
Clasificación