Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的网络TCP/UDP实现不起作用?_C++_Sockets_Tcp_Udp_Sfml - Fatal编程技术网

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

C++ 为什么我的网络TCP/UDP实现不起作用?,c++,sockets,tcp,udp,sfml,C++,Sockets,Tcp,Udp,Sfml,我想有一个服务器 可以发送和接收TCP消息 可以发送和接收UDP消息 多个客户端 可以发送和接收TCP消息 可以发送和接收UDP消息。 我为服务器使用基本套接字并选择,为客户端使用网络SFML模块 在服务器端,我创建套接字,将TCP和UDP端口绑定到4005 在客户端,我使用connecthost,ip call for TCP,并将UDP端口绑定到4006,因为我的UDP端口已经绑定到服务器端的4005 目前,我的TCP工作正常,我可以在客户端和服务器上发送和接收消息 我正在尝试从服务器向客户

我想有一个服务器

可以发送和接收TCP消息

可以发送和接收UDP消息

多个客户端

可以发送和接收TCP消息 可以发送和接收UDP消息。 我为服务器使用基本套接字并选择,为客户端使用网络SFML模块

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

在客户端,我使用connecthost,ip call for TCP,并将UDP端口绑定到4006,因为我的UDP端口已经绑定到服务器端的4005

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

我正在尝试从服务器向客户端发送UDP数据包。为此,我从接受的客户端套接字接收sockaddr\u,我想发送一条消息,由accept函数填充sockaddr\u

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

我这样发:

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;
}
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函数提供了错误的文件描述符,因此它不会发送是正常的。

在哪里可以找到_udpSocket.receive的代码或规范?我怀疑您只是不清楚它是如何工作的,它可能不是用于从UDP或sf接收的正确函数::Socket::Done可能不是要检查的正确返回值。@Omnifarious在本页上,嗯。。。你得到了什么样的返回值?@Omnifarious我得到了sf::Socket::NotReadyOh!您将套接字置于非阻塞模式。您的程序在调用updatequeudp之前是否会等到select说它是可读的?另外,另一种情况是,缓冲区可能太小,但这会导致部分缓冲区和未准备就绪。好吧,根据您向我们展示的代码,我们永远不会发现这一点-/