您好,登錄后才能下訂單哦!
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、
創建和命名后,是不能直接被客戶端訪問,需要創建一個監聽隊列來存放待處理的客戶連接
3.1 int listen(int sockfd, int backlog);
backlog參數提示內核監聽隊列的最大長度
超過之后,就不再受理客戶連接
錯誤消息是ECONNREFUSED
listen唱功返回0,失敗返回-1并且設置errno
完整的連接只是backlog+1 個
4.接受連接
int accept(int sockfd,struct sockaddr addr,socklen_t addrlen)
問題:如果有個客戶端請求出現網絡異常或者掉線,會怎樣?
答案:accept只是從監聽隊列取出來連接,不論連接出于什么狀態,更不會關心網絡變化
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。