#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
| 參數 | 常用值 | 說明 |
|---|---|---|
domain | PF_INET (IPv4), PF_INET6 (IPv6) | 協議族,決定位址格式 |
type | SOCK_STREAM (TCP), SOCK_DGRAM (UDP) | 通訊型別 |
protocol | 0 或 getprotobyname() 結果 | 具體協議,通常設 0 讓核心自動選擇 |
註:PF_* 與 AF_* 數值相同,可互換。SOCK_STREAM 對應 TCP,SOCK_DGRAM 對應 UDP。
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 返回的參數,免除硬編碼
errno(如 EAFNOSUPPORT、EMFILE、ENFILE)。bind, connect, send, recv...)均透過它操作。使用 getaddrinfo() 結果填充 socket() 參數,實現協議無關(IPv4/IPv6 通用)、無硬編碼、可移植的網絡程式編寫。