5.2. socket() ---獲得文件描述符
我不想長篇大論---我要談的調用系統函數socket()。下面是他的原型:
#include<sys/types.h>
#include<sys/socket.h>
int socket(intdomain, int type, int protocol);
但是這些參數干什麼的呢?他們允許你使用哪種套接字(IPv4還是IPv6;TCP還是UDP)。
它曾經是人們將這些值進行硬編碼,你也可以這麼做。(domain可以選擇PF_INET或者PF_INET6;type可以選擇SOCK_STREAM或者SOCK_DGRAM;protocol設置為0,或者你可以調用getprotobyname()來查找你想要的協議,“tcp”或“UDP” 。)
譯者注:SOCK_STREAM等同於TCP;SOCK_DGRAM等同於UDP。所以你不用費二遍事再作一次J
(編者在這兒又敘述了一下PF_*與AF_*的一些關系)
譯者注:他們其實是等同的,有興趣的讀者可以看《UnixNetwork Programming》第一卷中第四章第2節中的“AF_xxxVersus PF_xxx”
你真正要做的是把調用getaddrinfo()得到的結果值,直接給socket()函數使用像下面這樣:
int s;
struct addrinfohints, *res;
// do the lookup
// [pretend wealready filled out the “hints” struct]
getaddrinfo(www.example.com, “http”, &hints,&res);
// [again, youshould do error-checking on getaddrinfo(), and walk
// the “res”linked list looking for valid entries instead of just
// assuming thefirst one is good (like many of these example do.)
// See the sectionon client/server for real examples.]
s =socket(res->ai_family, res->ai_socktype, res->ai_protocol);
socket()函數只是簡單地返回給你一個套接字描述符,以供其後的其它系統函數使用;或者返回-1錯誤。全局變量errno是設置錯誤值的。(errno詳見man文檔)
好,好,好!但是使用這樣的方式有什麼益處嗎?答案就是:簡潔!
摘自 xiaobin_HLJ80的專欄