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

Beej 網絡編程指南第 9 篇:socket() 建立套接字描述符

     編輯:關於C

socket() 函數原型

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

參數含義

參數常用值說明
domainPF_INET (IPv4), PF_INET6 (IPv6)協議族,決定位址格式
typeSOCK_STREAM (TCP), SOCK_DGRAM (UDP)通訊型別
protocol0 或 getprotobyname() 結果具體協議,通常設 0 讓核心自動選擇

註:PF_* 與 AF_* 數值相同,可互換。SOCK_STREAM 對應 TCP,SOCK_DGRAM 對應 UDP。

現代最佳實踐:搭配 getaddrinfo()

int s;
struct addrinfo hints, *res;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;     // IPv4 或 IPv6 皆可
hints.ai_socktype = SOCK_STREAM; // TCP
getaddrinfo("www.example.com", "http", &hints, &res);

s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
// 直接使用 getaddrinfo 返回的參數,免除硬編碼

返回值與錯誤處理

  • 成功:返回非負整數套接字描述符(small non-negative integer)。
  • 失敗:返回 -1,設定 errno(如 EAFNOSUPPORT、EMFILE、ENFILE)。
  • 描述符僅為整數句柄,後續所有系統調用(bind, connect, send, recv...)均透過它操作。

優點總結

使用 getaddrinfo() 結果填充 socket() 參數,實現協議無關(IPv4/IPv6 通用)、無硬編碼、可移植的網絡程式編寫。

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