2011-11-22 94 views
1

我似乎無法弄清楚如何爲我的UDP服務器做下一步。到目前爲止,一個客戶端連接,然後它來回發送數據,但是當另一個客戶端連接服務器時,將從新客戶端獲取數據並將其發送到另一個客戶端。UDP處理多個客戶端

我打算檢查收到的消息是否來自新客戶端,如果是,則爲該客戶端提供服務器用於執行某些處理的標識符。這是正確的方式嗎?如果是的話,你如何做到這一點?我知道recvfrom具有「sockaddr * from」字段,我假設用該客戶端的數據填充該字段,但是如何使用該數據?

謝謝

+0

您可以使用recvfrom記錄每個客戶端ip,然後檢查傳入數據來自哪裏,將呼叫映射到正確的客戶端。或至少這樣的=) – Cyclonecode

+0

我試圖做到這一點,但它包含在「IN_ADDR」結構中,我不知道哪個成員是IP – Chris

+0

使用TCP。 UDP是無連接協議。 –

回答

1
sockaddr_in saddr; 
int length = sizeof(saddr); 
int read = recvfrom(your_socket, buff, 4096, 0, (sockaddr*)&saddr, &length); 
if(read != -1) { 
    // now saddr contains the address of the client 
    // the g_addr is a previously captured client address 
    if(saddr.sin_addr.S_un.S_addr = g_addr.sin_addr.S_un.S_addr) { 
     // returning client? 
    } else { 
     // not yet seen client, so store address 
    } 
} 
+0

我有這部分工作,我如何比較「saddr」與其他客戶? – Chris

+1

更好地使用'struct sockaddr_storage' - 它保證保存所有有效的sockaddrs的大小。 – glglgl

1

UDP是無連接的。嘗試使用TCP。你爲什麼決定使用UDP?你的約束是什麼?

+0

如果只是問題/答案,則不需要連接。如果有些東西丟失了,客戶會希望注意到它並自行重試。 – glglgl

0

recvfrom函數中的地址將填充來自客戶端的源信息。在udp的情況下,它會給你地址和端口,這對於IPv4來說很容易被轉換爲很長的時間並作爲標識符來存儲。 IPv4是4個字節+端口2個字節。您需要將指針轉換爲sockaddr_in,然後獲取sin_port和sin_addr的值。

+0

IP地址是共享的 - 因爲地址範圍的限制。 –

+0

@EdHeal - 對,但是如果標識符存儲爲:| --- 4字節IP --- | - 2字節端口 - | --- 2字節無 - - |。在NAT情況下,您不使用UDP與服務器進行通信。 – Karlson

+0

爲什麼不呢?如果你有一個UDP端口轉發,即使是這樣也可以。 – glglgl