首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言 Socket 實戰:AF_INET 資料報(Datagram)通訊

     編輯:關於C

資料報 Socket 流程

UDP 無連線、不可靠、無序,適合即時性要求高、資料量小的場景。

伺服器端步驟

  1. getaddrinfo() 取得位址資訊(AI_NUMERICSERV, AF_INET, SOCK_DGRAM)。
  2. socket() 建立 Socket。
  3. bind() 綁定位址。
  4. recvfrom() 接收資料(含客戶端位址)。
  5. freeaddrinfo() 釋放位址結構。

客戶端步驟

  1. getaddrinfo() 同樣取得位址。
  2. socket() 建立 Socket。
  3. sendto() 送資料至伺服器位址。
  4. freeaddrinfo()、close() 清理。

核心程式碼

Server

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);

Client

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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved