当前位置: 首页 > 知识库问答 >
问题:

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

傅浩漫
2023-03-14

我想有一个服务器

>

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

    可以发送和接收UDP消息。

    多个客户端

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

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

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

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

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

    我正在尝试从服务器向客户端发送一个UDP数据包。为此,我从我想要发送消息的已接受的客户端套接字中获取sockaddr_in(由接受函数填充的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;
    }
    

    但是接收从不返回的f::Socket::D一个

    你知道为什么我没有收到我客户的UDP中的任何内容吗?

  • 共有1个答案

    丁和歌
    2023-03-14

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

     类似资料:
    • 我对NAT表的理解是 NAT表仅映射(专用IP:端口)->(公用IP:端口) 它不关心协议或套接字连接 主机A关闭套接字并在同一本地端口(100)上打开新监听套接字 但这没用!我发现了其他复杂的实现,但我很好奇这种方式有什么问题。

    • Stage.close()对我不起作用。 我查看了:JavaFX2.0:关闭一个舞台(窗口) 这是我的代码: 下面是调用消息框类的代码:

    • 可能是,我必须做些什么来在我的服务器上获得贝宝网络钩子请求?因为我的个人资料中有关于所有测试付款的通知(“沙箱/通知”)。

    • 我正在尝试检测我的两个精灵何时发生碰撞。我做的第一件事是在我的播放器周围创建一个矩形(称为player.img),然后在我想检测的树周围创建另一个矩形(称为背景.treesrect)。我将玩家矩形的坐标设置为等于当用户按下键移动时更新的坐标,但玩家矩形不移动。然后我使用精灵.碰撞(精灵)函数来检测它们是否碰撞并且没有检测到。有人可以向我展示为什么我的播放器矩形没有更新以及其他任何可能错误的内容吗?

    • 问题内容: 我在这里有点困惑。如果我将变量传递给json_decode,它将不起作用: 第一个回显正确显示了我传递的JSON字符串,例如 第二个回显显示NULL。因此,我从第一个回显中获取了字符串,并编写了以下代码: 你怎么说,它向我展示了正确解码的数组。字符串绝对相同,我什至保留转义字符。也许是问题所在? 问题答案: 看起来您的服务器已启用。无论是将其禁用或运行通过使用它之前。

    • 还不起作用。所以我放弃链接,我只是编码: