2017-09-25 105 views
-1

我目前正在使用UDP为SFML构建一个网络原型。我创建了一个应用程序,您可以选择将其作为服务器或客户端。所以,通常我会启动应用程序的两个实例,一个是服务器,另一个是客户端。我连接到我的本地IP 127.0.0.1。为什么我在尝试使用SFML将我的UDP套接字绑定到端口时出现错误?

大约20分钟前,这个EXACT代码工作,我没有问题。我没有改变任何东西,但是这段代码不再工作,并且当我为服务器调用socket.bind()时程序崩溃。客户端,没有错误显示。

这是用C++完成的。

有没有人知道这可能的原因?据我所知,港口也没有使用。

我的客户端代码:

void runUdpClient(unsigned short port){ 
    sf::IpAddress server; 
    do 
    { 
     std::cout << "Type the address or name of the server to connect to: "; 
     std::cin >> server; 
    } while (server == sf::IpAddress::None); 

    sf::UdpSocket socket; 

    sf::Packet clientSendPacket; 
    std::string packetSendContent = "Packet data from the client"; 
    clientSendPacket << packetSendContent; 
    if (socket.send(clientSendPacket, server, port) != sf::Socket::Done) 
     return; 
    std::cout << "Message sent to the server: \"" << packetSendContent << "\"" << std::endl; 

    // Maak variabelen 
    sf::IpAddress sender; 
    unsigned short senderPort; 
    sf::Packet clientReceivePacket; 
    std::string clientReceiveContent; 
    if (socket.receive(clientReceivePacket, sender, senderPort) != sf::Socket::Done) 
     return; 

    clientReceivePacket >> clientReceiveContent; 
    std::cout << "Message received from " << sender << ": \"" << clientReceiveContent << "\"" << std::endl; 

} 

我的服务器代码:

void runUdpServer(unsigned short port){ 
    sf::UdpSocket socket; 

    if (socket.bind(port) != sf::Socket::Done) 
     std::cout << "Error binding socket for server"; 
     return; 

    std::cout << "Server is listening to port " << port << ", waiting for a message... " << std::endl; 

    sf::Packet serverReceivePacket; 
    std::string serverReceiveContent; 
    sf::IpAddress sender; 
    unsigned short senderPort; 

    if (socket.receive(serverReceivePacket, sender, senderPort) != sf::Socket::Done) 
     std::cout << "Error receiving packet for server"; 
     return; 
    serverReceivePacket >> serverReceiveContent; 
    std::cout << "Message received from client " << sender << ": \"" << serverReceiveContent << "\"" << std::endl; 

    sf::Packet serverSendPacket; 
    std::string serverSendContent = "Packet data from server"; 
    serverSendPacket << serverSendContent; 
    if (socket.send(serverSendPacket, sender, senderPort) != sf::Socket::Done) 
     std::cout << "Error sending packet from server"; 
     return; 

    std::cout << "Message sent to the client: \"" << serverSendContent << "\"" << std::endl; 
} 
+0

定义'崩溃'。错误是什么? – EJP

+0

它只是返回。 这部分是它失败的地方: if(socket.bind(port)!= sf :: Socket :: Done) std :: cout <<“服务器的错误绑定套接字”; return; – Mick

+0

因此,打印错误并告诉我们它是什么。这里还没有有用的信息。 – EJP

回答

0

在您的服务器代码中,if语句缺失花括号,因此只要socket.bind()退出,即表示成功或失败,您总是执行return。此代码:

if (socket.bind(port) != sf::Socket::Done) 
    std::cout << "Error binding socket for server"; 
    return; 

是一样的验证码

if (socket.bind(port) != sf::Socket::Done) 
    std::cout << "Error binding socket for server"; 
return; 

这是逻辑上等同于以下代码:

if (socket.bind(port) != sf::Socket::Done) { 
    std::cout << "Error binding socket for server"; 
} 
return; 

空白格式是不是C和C重要++。要执行if块体内部多条语句,你需要明确的括号:

if (socket.bind(port) != sf::Socket::Done) 
{ 
    std::cout << "Error binding socket for server"; 
    return; 
} 

同样与if报表服务器的呼叫socket.receive()socket.send()

如果socket.send()socket.receive()失败,那些if报表以自己的身体进行单陈述你的客户端代码不输出任何错误信息(即,只是return),所以括号是可选的。

0

您的服务器最有可能关闭没有正确关闭端口。 如果您等待几分钟,端口将可以再次免费使用(在我的Ubuntu 16.04系统上需要大约2-3分钟,可能会有所不同,具体取决于您使用的操作系统)

或者,您可以更改端口使用。

+0

不幸的是改变了港口并没有帮助我。我等了大约15分钟,但没有帮助。即时通讯使用Windows 10.我正在考虑很快重新启动我的电脑,看看它是否有帮助。 – Mick

+0

你可以尝试做socket.bind(sf :: Socket :: AnyPort),看看是否有效。如果是这样,则可以通过调用socket.getLocalPort()来获取端口。 – super

+0

不幸的是,也不工作 – Mick

-1

问题是if s和return的格式。点击后Ctrl + Shift + K,代码被重新格式化并且工作。

+0

格式化不会改变可执行代码的语义。你修了别的东西。 – EJP

相关问题