1.創(chuàng)建socket:所有的東西在UNIX都是文件
socket系統(tǒng)調(diào)用可創(chuàng)建一個socket
int socket (int domain, int type, int protocol);
domain:告訴系統(tǒng)使用那個底層協(xié)議族
type:指定服務類型
1.1服務類型有SOCK_STREAM和SOCK_UGRAM(數(shù)據(jù)報)
1.內(nèi)核在2.16.17開始,type可以接邏輯與的參數(shù)SOCK_NONBLOCK和SOCK_CLOEXEC來表示soocket是否非阻塞
1.3protocol參數(shù)在前兩個參數(shù)的下,在選擇一個具體的協(xié)議
調(diào)用結果:返回一個socket文件描述符,失敗返回-1并且設置errno
2.命名socket
創(chuàng)建的時候,我們只是指定了地址族,但是未指定使用具體的那個socket地址
講一個socket與socket地址綁定稱為socket命名
服務器需要命名socket,客戶端不需要
2.1int bind(int sockfd,const struct sockaddr * my_addr,socklen_t addrlen);
bind 成功返回0,失敗返回-1并設置errno
2.2 常見的失敗有EACCES:被綁定的地址是受保護的,僅僅是超級用戶可以訪問
EADDRINUSE:被綁定的地址正在使用
3.監(jiān)聽socket、
創(chuàng)建和命名后,是不能直接被客戶端訪問,需要創(chuàng)建一個監(jiān)聽隊列來存放待處理的客戶連接
3.1 int listen(int sockfd, int backlog);
backlog參數(shù)提示內(nèi)核監(jiān)聽隊列的大長度
超過之后,就不再受理客戶連接
錯誤消息是ECONNREFUSED
listen唱功返回0,失敗返回-1并且設置errno
完整的連接只是backlog+1 個
4.接受連接
int accept(int sockfd,struct sockaddr addr,socklen_t addrlen)
問題:如果有個客戶端請求出現(xiàn)網(wǎng)絡異?;蛘叩艟€,會怎樣?
答案:accept只是從監(jiān)聽隊列取出來連接,不論連接出于什么狀態(tài),更不會關心網(wǎng)絡變化
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。