2011-11-22 93 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