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

網路程式設計基礎:Socket 概念、類型與協議關係

     編輯:關於C語言

Socket 定義

Linux 網路程式設計透過 Socket 介面進行。Socket 是一種特殊的檔案描述符,提供進程間通信 (IPC) 機制。

  • 半關聯描述符 (被動/伺服器端):{協議, 本地地址, 本地埠}
  • 全關聯描述符 (主動/連線後):{協議, 本地地址, 本地埠, 遠端地址, 遠端埠}

Socket API 流程:socket() → bind() → listen() → accept() → read()/write() → close() (TCP 伺服器)

Socket 類型

類型宏定義協議特性
流式 SocketSOCK_STREAMTCP可靠、面向連線、雙向位元組流、有流控/擁塞控制
資料報 SocketSOCK_DGRAMUDP無連線、不可靠、訊息邊界保留、低延遲、表頭小
原始 SocketSOCK_RAWIP/ICMP/自定義直接存取網路層/傳輸層表頭,用於協議開發、封包分析

協議層級關係圖

應用層:HTTP, FTP, SMTP, DNS, SSH
         ↓
傳輸層:TCP (可靠串流)  ◄─── Socket API ───►  應用程式
         ↓                    ↑
         UDP (資料報)        │
         ↓                    │
網路層:IP (路由、分片)     │
         ↓                    │
資料鏈路層:Ethernet, WiFi, PPP
         ↓
物理層:光纖, 雙絞線, 無線電波

Loopback 介面 (127.0.0.1 / ::1)

  • 本機進程間通信不經實體網卡,由核心虛擬介面回環。
  • 優點:效能高、隔離性好、開發測試方便。
  • 部署時只需修改 IP/埠即可遷移至分散式架構。

常用 Socket API 速查


// 建立
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // IPv4 TCP
int sockfd = socket(AF_INET6, SOCK_DGRAM, 0); // IPv6 UDP

// 綁定
struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr.s_addr = INADDR_ANY };
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

// 監聽 (僅 TCP)
listen(sockfd, SOMAXCONN);

// 接受連線 (僅 TCP)
int connfd = accept(sockfd, NULL, NULL);

// 發送/接收
send(sockfd, buf, len, 0);
recv(sockfd, buf, len, 0);
sendto(sockfd, buf, len, 0, (struct sockaddr*)&dst, sizeof(dst)); // UDP
recvfrom(sockfd, buf, len, 0, (struct sockaddr*)&src, &slen);    // UDP

// 關閉
close(sockfd);
shutdown(sockfd, SHUT_RDWR); // 半關閉

進階主題

  • I/O 多路複用:select/poll/epoll (Linux)、kqueue (BSD/macOS)、IOCP (Windows)
  • 非阻塞/異步 I/O:fcntl(sock, F_SETFL, O_NONBLOCK)、aio_read/aio_write
  • Socket 選項:setsockopt (SO_REUSEADDR, TCP_NODELAY, SO_RCVBUF/SO_SNDBUF)
  • IPv6 雙棧:AF_INET6 + IPV6_V6ONLY=0 同時接受 IPv4/IPv6
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved