如圖是客戶端的程式,客戶端先向服務端發送一串字串,然后服務端接收到后再發送回來給客戶端。
我的疑問是,劃線處的socket不是客戶端自己的socket嗎,既然要向服務端發送資料,又要從服務端接收資料,為什么不用服務端的socket而是自己的socket?
我還看了服務端程式,服務端的send和recv用的是客戶端的socket
uj5u.com熱心網友回復:
3.當呼叫socket創建一個socket時,回傳的socket描述字它存在于協議族空間中,但沒有一個具體的地址。如果想要給它賦予一個地址,就必須呼叫bind()函式,否則系統就在呼叫connect()、listen()時自動隨機分配一個埠。通常服務器在啟動的時候都會系結一個眾所周知的地址(如ip地址+埠號),用于提供服務,客戶就可以通過它來鏈接服務器;而客戶端就不用指定,有系統自動分配一個埠號和自身的IP地址組合。這就是為什么通常服務器在呼叫listen之前會呼叫bind()而客戶端就不用呼叫,客戶端而是在connect()時由系統隨機生成一個。5.listen的第二個引數為可以排隊的最大連接個數。socket()創建的socket默認是一個主動型別,listen函式將socket變為被動型別,等待客戶的連接請求。
6.accept()的第二個引數用于回傳客戶端的協議地址(不需要可設為空)。如果accept成功,那么其回傳值是由內核自動生成的一個全新的描述字(第一個引數是服務器的socket描述字,回傳的是已連接的socket描述字,兩個socket不是同一個),代表與回傳客戶的TCP鏈接。
一個服務器通常僅僅只創建一個監聽socket描述字,他在該服務器的生命周期內一直存在。內核為每個由服務器行程接受的客戶創建了一個已連接socket描述字,當服務器完成了對某個客戶的服務,相應的已連接soocket描述字就被關閉。
uj5u.com熱心網友回復:
1服務端accept了客戶端的connect之后,會創建新的套接字與客戶端通信,也就是說,服務端有兩個套接字,一個套接字用戶listen和accept,另一個套接字用來send和recv;2客戶端只有一個套接字,用來connect、send和recv。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58121.html
標籤:C++ 語言
上一篇:新生實在不會
下一篇:【小白求救】
