c++ - 我可以在 TCP 和 UDP 中使用相同的 sockaddr_in 吗?

标签 c++ sockets tcp udp

在我的服务器中,我将 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/

相关文章:

linux - 使用 SOCAT 记录在端口上收到的消息

c++ - Eclipse Luna CDT 在 Windows 64 中失败

java - 单个页面上的 Websocket 数

c - 运行服务器进程时动态获取C中未使用的端口号

c - getaddrinfo() 返回 2.0.0.0

java - 使用netty解析XML字符串

c++ - 二元运算的类型删除

c++ - 如何写入通过映射迭代器访问的 ofstream

c++ - 当指向对象的指针作为参数传递给 std::thread 时的内存可见性

java - 连接错误 : javax. microedition.io.ConnectionNotFoundException:TCP 打开