在我的服务器中,我将 TCP 和 UDP 绑定(bind)在两个不同的端口上。 我首先将我的客户端连接到 TCP(通过接受等)
然后我想使用 UDP 在我的服务器和我的客户端之间进行通信。
所以我尝试使用相同的 sockaddr_in
:
void AUDPMonitor::sendMessage(Message &msg)
{
for (ISocket *socket: *_fdListClients)
{
if (msg.getClientId() == socket->getSock())
{
UDPSocket *UdpSocket = reinterpret_cast<UDPSocket *>(socket);
UdpSocket->send(msg, socket->getUserAddr());
break;
}
}
}
_fdListClients
是我从 TCP 连接得到的 Socket vector 。
没有错误消息,但我的客户没有收到任何信息。
所以我想知道是否可以使用相同的 sockaddr_in 或者是否不可能。
编辑:当我接受客户端套接字时
socklen_t client_sin_len;
sockaddr_in *client_sin = new sockaddr_in;
client_sin_len = sizeof(sockaddr_in );
std::cout << "New User ! " << std::endl;
if ((cs = accept(fd, reinterpret_cast<struct sockaddr *>(client_sin), &client_sin_len)) == -1)
最佳答案
您可以为 TCP 和 UDP 使用 sockaddr_in
的相同拷贝,但它们必须位于不同的套接字上。
使用 AF_INET
创建的给定套接字还指定 SOCK_STREAM
制作 TCP 或 SOCK_DGRAM
制作 UDP。
所以如果你有这个:
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(12345);
您可以将它传递给 bind
并使用 TCP 套接字绑定(bind)到 TCP/12345,您可以将它传递给 bind
使用 UDP 套接字绑定(bind)到 UDP/12345.
关于c++ - 我可以在 TCP 和 UDP 中使用相同的 sockaddr_in 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41266680/