c++ - 为什么我的网络 TCP/UDP 实现不起作用?

标签 c++ sockets tcp udp sfml

我想要一个服务器

  • 可以发送和接收 TCP 消息。

  • 可以发送和接收 UDP 消息。

多个客户端

  • 可以发送和接收TCP消息
  • 可以发送和接收 UDP 消息。

我为我的服务器使用基本套接字和select,为客户端使用网络 SFML 模块 (http://www.sfml-dev.org/tutorials/2.4/network-socket.php)。

在服务器端,我创建套接字,将 TCP 和 UDP 端口绑定(bind)到 4005。

在客户端,我使用 connect(host, ip) 调用 TCP,并将 UDP 端口绑定(bind)到 4006,因为我的 UDP 端口已经在服务器端绑定(bind)到 4005。

目前,我的 TCP 工作正常,我可以在两端(客户端和服务器)发送接收消息。

我正在尝试从服务器向客户端发送 UDP 数据包。为此,我从要发送消息的已接受客户端套接字中获取 sockaddr_in(由 accept 函数填充的 sockaddr_in)。

但是当我发送它时,我的客户没有收到它。

我这样发送:

unsigned int UDPSocket::send(Message &buffer, sockaddr_in const &addr)
{
  sockaddr_in cpy;

  std::memcpy(&cpy, &addr, sizeof(sockaddr_in));
  //return ::send(_sock, buffer.getData().data(), buffer.getData().size(), 0);
  std::cout << "sending to " << buffer.getClientId() << std::endl;
  int fromsize = sizeof(sockaddr_in);
  cpy.sin_port = htons(4005 +1);
  std::cout << "sending to " << 4005 + 1 << std::endl;
  int ret = ::sendto(_sock, buffer.getMessage(), buffer.getSize(), 0, (struct sockaddr *) &cpy, fromsize);
  perror("sendto");
  std::cout << ret << std::endl;
  return ret;
}

ret 优于 0 并且 perror 返回成功,因此应该发送消息。

我是这样接收的:

bool              Network::updateQueueUDP()
{
  unsigned char   data[sizeof(Protocol::rtypePacket)];
  bool            ret = false;
  std::size_t     received;
  sf::IpAddress   sender;
  unsigned short  senderPort;

  if (_udpSocket.receive(data, sizeof(data), received, sender, senderPort) == sf::Socket::Done)
  {
    Message *msg = new Message();
    msg->setMessage(data, received, 0);
    _udpQueue.push(msg);
    std::cout << "pushing" << std::endl;
    ret = true;
  }
  return ret;
}

但是receive 永远不会返回sf::Socket::Done

您知道为什么我在客户端的 UDP 中没有收到任何信息吗?

最佳答案

我给 sendto 函数提供了错误的文件描述符,所以它不会发送是正常的。

关于c++ - 为什么我的网络 TCP/UDP 实现不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41315848/

相关文章:

c++ - sscanf 错误 : cannot convert 'String' to 'const char*'

c++ - 有限域上超定系统解的存在性

c++ - 如何在 C++ 中实现自然排序算法?

c++ - 使用 Cmake 移动 .gcda 文件

java - 如何使用 Java 套接字将加密添加到我自己的基于 TCP 的协议(protocol)中?

c# - Android客户端自动寻找C#服务器

java - 组播数据开销?

java - 延迟数据包时的 TCP RST 数据包

sockets - 如何通过 RAW 套接字使用 TCP 校验和卸载

tcp - GnuRadio tcp_sink 数据值乱码