我似乎無法弄清楚如何爲我的UDP服務器做下一步。到目前爲止,一個客戶端連接,然後它來回發送數據,但是當另一個客戶端連接服務器時,將從新客戶端獲取數據並將其發送到另一個客戶端。UDP處理多個客戶端
我打算檢查收到的消息是否來自新客戶端,如果是,則爲該客戶端提供服務器用於執行某些處理的標識符。這是正確的方式嗎?如果是的話,你如何做到這一點?我知道recvfrom具有「sockaddr * from」字段,我假設用該客戶端的數據填充該字段,但是如何使用該數據?
謝謝
我似乎無法弄清楚如何爲我的UDP服務器做下一步。到目前爲止,一個客戶端連接,然後它來回發送數據,但是當另一個客戶端連接服務器時,將從新客戶端獲取數據並將其發送到另一個客戶端。UDP處理多個客戶端
我打算檢查收到的消息是否來自新客戶端,如果是,則爲該客戶端提供服務器用於執行某些處理的標識符。這是正確的方式嗎?如果是的話,你如何做到這一點?我知道recvfrom具有「sockaddr * from」字段,我假設用該客戶端的數據填充該字段,但是如何使用該數據?
謝謝
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
}
}
recvfrom函數中的地址將填充來自客戶端的源信息。在udp的情況下,它會給你地址和端口,這對於IPv4來說很容易被轉換爲很長的時間並作爲標識符來存儲。 IPv4是4個字節+端口2個字節。您需要將指針轉換爲sockaddr_in,然後獲取sin_port和sin_addr的值。
您可以使用recvfrom記錄每個客戶端ip,然後檢查傳入數據來自哪裏,將呼叫映射到正確的客戶端。或至少這樣的=) – Cyclonecode
我試圖做到這一點,但它包含在「IN_ADDR」結構中,我不知道哪個成員是IP – Chris
使用TCP。 UDP是無連接協議。 –