[英]what does socket.connect() do internally?
所以我試圖了解網絡,尤其是套接字。 我正在使用Python套接字庫來玩游戲。
我在互聯網上遇到了很多通過簡單的ECHO服務器演示TCP和UDP套接字的例子。
對於TCP對應物,資源建議TCP回送客戶端使用
socket_object.connect()連接到服務器並通過它交換數據。 同樣,TCP echo服務器使用listen()和accept()來處理與客戶端的連接和交互。
問題
類似地,對於UDP對應物, 資源表明UDP echo客戶端不使用任何connect(),UDP echo服務器也不使用任何listen()或accept()。 這有助於實現無連接行為。 請幫我理解具體怎么樣? 或者可能是答案,上面的問題1也可以幫助我理解這一點。
另外,在我們的情況下,如果是UDP echo客戶端,為什么它不需要綁定到套接字。 即使能夠將數據發送到遠程服務器,它仍然不需要套接字端點來實際發送數據並在服務器發回數據時也接收數據嗎? 或者基本上,我想,了解bind()內部的確實會幫助我理解這一點。
請幫助我理解說明面向連接的實現意味着什么?
這意味着TCP協議依賴於開放連接來工作。 換句話說, 必須有一個開放的連接,通過套接字發送消息的包。
connect(),listen()和accept()API如何幫助實現這一目標?
我從未使用過這個Python套接字庫,但我認為我對套接字的相關基礎知識足以解釋這一點。 connect
方法用於打開我在上一個答案中提到的這個連接。 服務器使用另外兩種方法來接收通過此打開連接從客戶端發送的消息。
類似地,對於UDP對應物,資源表明UDP echo客戶端不使用任何connect(),UDP echo服務器也不使用任何listen()或accept()。 這有助於實現無連接行為。 請幫我理解具體怎么樣?
您可能知道UDP協議與TCP協議不同,它不依賴於開放連接。 這意味着消息包是“原子地”發送的(彼此獨立),這將使以前的方法無效。 如您在問題中鏈接的文檔中所述:
由於沒有連接本身,服務器不需要監聽和接受連接。 它只需要使用bind()將其套接字與端口關聯,然后等待單個消息。
這意味着使用UDP進行套接字通信的服務器所必須做的就是注冊它所期望的套接字消息的端口,該端口將從客戶端發送並通過recvfrom
方法接收。 客戶端也使用此方法從服務器接收消息。
即使能夠將數據發送到遠程服務器,它仍然不需要套接字端點來實際發送數據並在服務器發回數據時也接收數據嗎?
API可能不會公開一個方法來執行該客戶端,因為客戶端動態選擇端口並阻止其他程序成為該端口中的服務器,或者至少應該這樣做。
也許我錯了,但我可以理解connect()只是檢查IP和端口是正確的,來自另一方的應用程序已准備就緒。 listen()和bind()向OS發送有關端口的信息 - “如果某個軟件包將到達端口xxx,請將其發送給我”。 accept()向第一個應用程序發送信息,確保一切正常,我們可以互相交談。 此方法(而不是接受)只是通知操作系統接受或拒絕來自其他應用程序的包。 接受通知另一個應用程序一切正常,我們可以開始說話
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.