我似乎无法弄清楚如何为我的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是无连接协议。 –