2014-04-13 149 views
0

我有一個關於如何在C中套接字的問題。英語不是我的第一語言,但我會盡我所能來解釋我的問題。套接字接收和發送數據端口C

我的功能應該可以SENDRECEIVE數據。傳出數據的端口必須與傳入數據的端口不同。

例如,在這種情況下PORT1可以是相同的PORT2

int ds_sock; 
ds_sock=socket(AF_INET, SOCK_DGRAM,0); 
struct sockaddr_in my; 
my.sin_family=AF_INET; 
my.sin_port=   PORT1; 
my.sin_addr.s_addr=INADDR_ANY; 
bind(ds_sock,&my,sizeof(my)); 

struct sockaddr_in Eaddr; 
Eaddr.sin_family=AF_INET; 
Eaddr.sin_port=   PORT2; 
Eaddr.sin_addr.s_addr=IP; 
sendto(ds_sock,buff,1024,0,(struct sockaddr*)&Eaddr,sizeof(Eaddr)); 
+0

什麼問題?如果這是你需要做的,你可以發送到你自己的端口。 – EJP

+0

@EJP首先感謝您的關注。我想將數據發送給另一個客戶端。我的問題是:socked與PORT1「綁定」。它可以通過PORT2發送事物嗎? 而且,PORT 1可以與PORT2相同,否則我會收到任何錯誤,因爲傳入端口與傳出端口相同? – testermaster

回答

0

理論上,是的。這兩個端口可以是相同的。考慮以下幾點:

計算機A計算機B

如果A想發送給B,A必須知道什麼端口B被監聽。 稍後,如果B想要發送給A,則B必須知道A正在監聽哪個端口。

A可能正在監聽端口7777;並且b也在端口7777上監聽。 在這種情況下,(在你的例子中)PORT1可能與PORT2相同。

另一個例子......

如果一個網頁瀏覽器希望發送到stackoverflow.com請求特定頁面,該請求被髮送到衆所周知的端口80(stackoverflow.com:80)在stackoverflow.com服務器正在偵聽。然後,stackoverflow.com服務器必須將回復發送回Web瀏覽器。問題是,Web瀏覽器在偵聽什麼端口?
Web瀏覽器不太可能在端口80上偵聽,而是偵聽由Web瀏覽器系統動態分配的端口號。

當Web瀏覽器將請求發送到stackoverflow.com服務器時,它會通知服務器它將在IP「源」地址中偵聽的套接字。

所以,要更直接地回答你的問題; 「PORT1可以和PORT2一樣嗎?」

回答:

如果端口在兩個系統上都可用,是的。 如果這個例子是針對單個系統的,第二次嘗試獲取 端口(用於監聽)將失敗(在同一系統上)。

+0

感謝您的幫助。所以......如果A在7777發送數據到A時通過7777發送數據會發生什麼? PS:你能否證實我寫的代碼是正確的,如果我把PORT1 = 7777和PORT2 = 7777以及如果我把PORT1 = 7777和PORT2 = 6666都寫出來? – testermaster