socket的相關操做

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只是從監聽隊列取出來鏈接,不論鏈接出於什麼狀態,更不會關心網絡變化

相關文章
相關標籤/搜索