簡體   English   中英

正確的命令以在Internet域中為端口0發送數據報

[英]Correct command to send in a datagram in the internet domain for port 0

我將按照“ 4.4BSD進程間通信入門”教程中給出的示例進行說明,該過程顯示了如何使用Internet域中的數據報進行通信。 在示例6a和6b中,6a設置端口和主機名

name.sin_addr.s_addr = INADDR_ANY;
name.sin_port = 0;

據我了解, INADDR_ANY是一個通配符值,允許套接字從任何地方接收。 但是,我無法從任何地方發送並在6b中顯式設置主機名

hp = gethostbyname(argv[1]);

那么什么主機名在這里有效? 當我嘗試過

program6b localhost 0

但這表示無法分配請求的地址(我使用了其他地址和同一條消息)。 6a說“套接字的端口號為0”,盡管這意味着它在所有端口上偵聽,對嗎? 無論如何,我都嘗試手動設置該帖子,以便“套接字具有端口#53790”。 Netstat顯示它正在監聽

udp4 0 0 * .53790

並使用命令

program6b localhost 53790

我得到的響應是已從讀取的套接字接收到數據。 因此,我部分理解了所發生的情況,但是我想知道該示例應如何在端口#0上工作。

端口0,不能同時使用UDP和TCP。 它們在套接字API bind中指示,以請求操作系統將任意空閑端口分配給應用程序。 通常是通過客戶端代碼完成的,不需要關心所使用的特定端口。 另一方面,服務器代碼通常指定一個已知端口。

關於INADDR_ANY ,在進行本地bind時表示:

  • 偵聽所有網絡接口(如果套接字正在偵聽)。
  • 讓操作系統選擇適當的網絡接口來發送數據。

相反,如果您指定一個地址,則該地址應該是您計算機的地址,並且是指擁有該地址的網絡接口。 然后:

  • 如果套接字正在偵聽:它將僅在該網絡接口中偵聽。
  • 如果套接字發送數據,它將僅考慮該網絡接口。

注意:除非使用某種原始套接字,否則您無法同時收聽每個端口。 但不適用於UDP或TCP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM