The Linux Channel

TUTORIALS :: Código de soquete de amostra UDP para desenvolvedores de software de sistemas e redes

Written by: Kiran Kankipati - Published: 14-Dec-2017


Língua :: Inglês

Aqui está o meu exemplo de código de soquete UDP escrito em C. Ao contrário de outras versões, você obtém em comum, esta versão é focada em sistemas e desenvolvedores de software de rede e como uma referência rápida, mesmo para programadores de software experientes. Neste exemplo / modelo, estou enviando bytes de dados binários crus de teste do cliente de exemplo UDP para o servidor de amostra UDP registrado. O código já possui documentação na forma de comentários (como você pode ver abaixo). Você pode baixar minha fonte abaixo e você pode usá-lo diretamente em seus projetos ou pode usar o mesmo para fins de aprendizagem para entender sobre programação de soquete de espaço para usuário via protocolo de camada de transporte IPv4 UDP.

O UDP é muito exclusivo, versátil e flexível ao contrário do TCP, portanto, isso pode ser usado como mecanismo interno do dispositivo IPC, em vez disso, usando plataformas mais tradicionais, como filas de mensagens, pipes, etc. Ao contrário de outros mecanismos de IPC, isso fornece um modo transparente a prova de falhas para depurar seu software através da captura de pacotes Wireshark e permite que você consiga corrigir os problemas passando pelos dados de captura de pacotes binários em bruto.

UDP como uma futura plataforma de comunicação de rede de alta velocidade: UDP também é experimentado para ser usado como um protocolo de carreira de comunicação de alta velocidade ao contrário do TCP. TCP restringe a rede avançada Arquitetos de software para usar o TCP proporcionaram controle de congestionamento, seqüência de pacotes fora de ordem, recursos. Mas UDP fornece um acesso bruto para a rede, para que os usuários avançados possam arquitetar esses utilitários no espaço de usuário, protocolo (s) da camada de aplicação. Por exemplo Para os mesmos motivos óbvios, o Google inventou o protocolo QUIC, que usa o UDP como seu protocolo de carreira no navegador Chrome do Google em vez disso Protocolo HTTPS / SSL baseado em TCP. A QUIC possui sua própria camada de confiabilidade de camada de aplicação de espaço de usuário que garante situações como perda de pacotes, segurança, controle de congestionamento e assim por diante. E com o QUIC Google também pode multiplexar várias conexões / sessões remotas em um único canal de comunicação, melhorando o desempenho da rede e a experiência do usuário.

Aqui está o meu vídeo de demonstração ao vivo muito detalhado do mesmo, se você estiver interessado, observe gentilmente meu vídeo para que você possa obter o perspectiva maior. Eu também discuti todos os pontos acima em profundidade.


Aqui está o meu código fonte do meu cliente de soquete UDP de teste. Download: udp_socket_client.c

/* udp_socket_client.c
 * The Linux Channel
 * Author: Kiran Kankipati
 * Updated: 01-Feb-2017
 */

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXBUF 1024

int main()
{ int sockfd, len, i;
  unsigned char buf[MAXBUF];
  struct sockaddr_in udp_server_addr;
  socklen_t addr_size;

  sockfd = socket(PF_INET, SOCK_DGRAM, 0); // create a UDP socket
  if(sockfd<=0) { printf("socket error !\n"); return 0; }

  /* configure settings to communicate with remote UDP server */
  udp_server_addr.sin_family = AF_INET;
  udp_server_addr.sin_port = htons(6800); // server port
  udp_server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // local-host
  memset(udp_server_addr.sin_zero, '\0', sizeof udp_server_addr.sin_zero);  
  addr_size = sizeof udp_server_addr;

  memset(buf, 0xab, MAXBUF); // set the entire buffer with 0xab (i.e 1010 1011 binary)

  sendto(sockfd, buf, MAXBUF, 0, (struct sockaddr *)&udp_server_addr, addr_size); //send the data to server
  
  len = recvfrom(sockfd, buf, MAXBUF, 0, NULL, NULL); // receive data from server
  
  printf("Received from server: %d bytes\n", len); for(i=0;i<len;i++) { printf("%02x ", buf[i]); } printf("\n"); //print received data dump

  close(sockfd); //close socket file-descriptor
  
  return 0;
}

Compile the udp_socket_client.c:

kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$ gcc -o udp_socket_client udp_socket_client.c
kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$


Aqui está o meu código-fonte do meu servidor de soquete UDP de teste. Download: udp_socket_server.c

/* udp_socket_server.c
 * The Linux Channel
 * Author: Kiran Kankipati
 * Updated: 01-Feb-2017
 */

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXBUF 1024

int main()
{ int sockfd, len, i;
  unsigned char buf[MAXBUF];
  struct sockaddr_in udp_server_addr;
  struct sockaddr_in udp_client_addr;
  struct sockaddr_storage server_storage;
  socklen_t addr_size, client_addr_size;

  sockfd = socket(PF_INET, SOCK_DGRAM, 0); // create a UDP socket
  if(sockfd<=0) { printf("socket error !\n"); return 0; }

  /* configure settings to register UDP server */
  udp_server_addr.sin_family = AF_INET;
  udp_server_addr.sin_port = htons(6800); // server port
  udp_server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // local-host
  memset(udp_server_addr.sin_zero, '\0', sizeof udp_server_addr.sin_zero);  
  bind(sockfd, (struct sockaddr *) &udp_server_addr, sizeof(udp_server_addr)); // bind the socket
  addr_size = sizeof server_storage;
  
  len = recvfrom(sockfd, buf, MAXBUF, 0, (struct sockaddr *)&server_storage, &addr_size); //receive data from client 
  
  printf("Received from server: %d bytes\n", len); for(i=0;i<len;i++) { printf("%02x ", buf[i]); } printf("\n"); //print received data dump
	
  memset(buf, 0xcd, MAXBUF); // set the entire buffer with 0xcd (i.e 1100 1101 binary)

  sendto(sockfd, buf, MAXBUF, 0, (struct sockaddr *)&server_storage, addr_size); //send the data to client

  return 0;
}

Compile the udp_socket_server.c:

kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$ gcc -o udp_socket_server udp_socket_server.c
kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$


Execute os binários:

kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$ ls
udp_socket_client  udp_socket_client.c  udp_socket_server  udp_socket_server.c
kiran@WD-1TB2:/code/thelinuxchannel/udp_socket$

Primeiro, execute o udp_socket_server em um terminal para que ele registre e escute na porta 6800 como mostrado abaixo:
execute udp server in the terminal

Agora, em um terminal diferente, verifique o status do registro do servidor UDP via netstat -l command:
with netstat check the status of udp server registration

Antes de executar o cliente UDP, abra o Wireshark e capture a porta de loopback local lo como mostrado abaixo:
before executing udp client open wireshark and capture local loopback port

Execute o cliente de soquete UDP em um terminal diferente como mostrado abaixo. Você pode ver assim que for executado, ele envia o teste dados para o servidor de soquetes UDP e recebe os dados de teste do servidor.
execute udp socket client in a different terminal

Aqui está a captura de tela do terminal de execução do servidor de soquetes UDP. O servidor de soquete UDP recebe os dados de teste do cliente imprime o mesmo na tela (conforme mostrado abaixo) e responde rapidamente ao cliente enviando o próprio despejo de dados de teste.
received data in udp server from udp client

Na captura de pacotes Wireshark você pode ver esses pacotes, analisar e confirmar o mesmo. Abaixo está a captura de pacote Wireshark do pacote UDP de cliente para servidor:
wireshark capture of udp packet client to server

E aqui está a captura de pacotes Wireshark do pacote UDP do servidor para o cliente:
Wireshark captura de servidor de pacotes udp para cliente

Cursos Linux oferecidos: Se você estiver interessado em participar de aulas em rede, Linux, software de sistemas, etc. com sessões de treinamento de demonstração ao vivo. Você pode aprender através da plataforma de ensino à distância. Ensino meus alunos de forma antiquada. E eu acredito que é assim que a educação deve ser fornecida sem limites e limites. Para mais detalhes, visite CURSOS.



Suggested Topics:

Network Software Development:

Research Projects:
Research Socket overhead in Linux vs Message Queues and benchmarking
21-Jun-2017

Linux (user-space), Systems Architecture:
Dynamic linking without STDLIB in Linux user-space C programming
05-May-2017
Linux user-space Atomic Operations via GCC Atomic builtins
22-Mar-2017
A Linux system call in C without a standard library
10-Mar-2017

Linux Kernel Software Development:
How to upgrade or install a latest current release Linux Kernel version manually in Ubuntu?
05-Jan-2018
Linux Networking Stack :: RFS: Receive Flow Steering
09-Dec-2017
How to submit your Linux Kernel Patch
07-Feb-2017

Embedded Projects:
Using a GPS Sensor
28-Jul-2017
GPS Geo-tracking system using LinkIt ONE
11-Jan-2017

 

Live Youtube Channel Subscriber Count:

Recommended Topics:

Join a class (course):


JOBS :: Software Engineers - Freshers - Off-Campus:


191 Linux Kernel /proc Interface - create and read /proc file:


TUTORIALS :: UDP sample socket code for Systems and Network software developers:


Network Packet Processing Hardware Offload:



The Linux Channel - v6.54 :: Updated: 08-Jan-2018 :: © 2018 :: Author: Kiran Kankipati
Your IP: 54.226.41.91 :: Browser: CCBot/2.0 (http://commoncrawl.org/faq/)