1.建立socket:全部的東西在UNIX都是文件 socket系統調用可建立一個socket int socket (int domain, int type, int protocol); domain:告訴系統使用那個底層協議族 type:指定服務類型 1.1服務類型有SOCK_STREAM和SOCK_UGRAM(數據報) 1.內核在2.16.17開始,type能夠接邏輯與的參數SOCK_NONBLOCK和SOCK_CLOEXEC來表示soocket是否非阻塞 1.3protocol參數在前兩個參數的下,在選擇一個具體的協議 調用結果:返回一個socket文件描述符,失敗返回-1而且設置errno 2.命名socket 建立的時候,咱們只是指定了地址族,可是未指定使用具體的那個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.監聽socket、網絡
建立和命名後,是不能直接被客戶端訪問,須要建立一個監聽隊列來存放待處理的客戶鏈接dom
3.1 int listen(int sockfd, int backlog);socket
backlog參數提示內核監聽隊列的最大長度ide
超過以後,就再也不受理客戶鏈接code
錯誤消息是ECONNREFUSED隊列
listen唱功返回0,失敗返回-1而且設置errnoit
完整的鏈接只是backlog+1 個class
4.接受鏈接請求
int accept(int sockfd,struct sockaddr addr,socklen_t addrlen)
問題:若是有個客戶端請求出現網絡異常或者掉線,會怎樣?答案:accept只是從監聽隊列取出來鏈接,不論鏈接出於什麼狀態,更不會關心網絡變化