Diferente TCP, UDP é connectionless. Cliente deve explicitamente bind porta local (opcional mas recomendado) e especificar destino a cada send.
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) perror("socket"); struct sockaddr_in local = {0}; local.sin_family = AF_INET; local.sin_addr.s_addr = htonl(INADDR_ANY); local.sin_port = htons(0); // 0 = OS atribui porta efêmera bind(sockfd, (struct sockaddr*)&local, sizeof(local)); Binding permite servidor responder porta conhecida e habilita regras firewall.
struct addrinfo hints = {0}, *res; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_DGRAM; getaddrinfo("server.example.com", "5000", &hints, &res); // res->ai_addr agora hold destination sockaddr_in char *msg = "Hello UDP"; sendto(sockfd, msg, strlen(msg), 0, res->ai_addr, res->ai_addrlen);
sendto argumentos: socket, buffer, length, flags (0), destination sockaddr, sockaddr length.
char buf[1500]; struct sockaddr_in from; socklen_t fromlen = sizeof(from); ssize_t n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&from, &fromlen); if (n > 0) process(buf, n, &from);
recvfrom bloqueia até datagrama chegar. from contém IP/porta sender.
freeaddrinfo(res); close(sockfd);
| Aspecto | TCP | UDP |
|---|---|---|
| Conexão | connect() estabelece | Sem conexão; sendto especifica dest cada vez |
| Confiabilidade | Garantida, ordenada | Best-effort; pode perder, reordenar, duplicar |
| Controle Fluxo | Sim (window) | Não (app deve pace) |
| Uso Típico | Web, email, SSH | DNS, NTP, VoIP, gaming, streaming, IoT |
bind() → servidor responde porta efêmera; NAT/firewall pode dropar.sendto/recvfrom.recvfrom bloqueando forever — use select()/poll() ou setsockopt(SO_RCVTIMEO) para timeouts.Tecnologia Eletrônica © [www.351231.com]