UDP 無連線、不可靠、無序,適合即時性要求高、資料量小的場景。
getaddrinfo() 取得位址資訊(AI_NUMERICSERV, AF_INET, SOCK_DGRAM)。socket() 建立 Socket。bind() 綁定位址。recvfrom() 接收資料(含客戶端位址)。freeaddrinfo() 釋放位址結構。getaddrinfo() 同樣取得位址。socket() 建立 Socket。sendto() 送資料至伺服器位址。freeaddrinfo()、close() 清理。struct addrinfo hints = {0}, *res;
hints.ai_flags = AI_NUMERICSERV;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
getaddrinfo("localhost", "1080", &hints, &res);
int sfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
bind(sfd, res->ai_addr, res->ai_addrlen);
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
char buf[128];
recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &len);
printf("[server] received: %s\n", buf);
freeaddrinfo(res);
close(sfd);
struct addrinfo hints = {0}, *res;
hints.ai_flags = AI_NUMERICSERV;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
getaddrinfo("localhost", "1080", &hints, &res);
int cfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
char buf[] = "dgram";
sendto(cfd, buf, sizeof(buf), 0, res->ai_addr, res->ai_addrlen);
printf("[client] sent: %s\n", buf);
freeaddrinfo(res);
close(cfd);
gcc server.c -o server
gcc client.c -o client
./server & # 背景執行
./client
[client] sending data (dgram ) to server by socket
[server] receiving data (dgram) from client by socket
使用 getaddrinfo 可提高跨平台可攜性,避免硬編碼 sockaddr_in。