繁体   English   中英

当我尝试将 UDP 套接字绑定到具有 SFML 的端口时,为什么会出现错误?

[英]Why do i get an error when i try to bind my UDP socket to a port with SFML?

我目前正在使用 UDP 为 SFML 构建网络原型。 我创建了一个应用程序,您可以在其中选择作为服务器或客户端。 所以,通常我会启动应用程序的 2 个实例,让一个作为服务器,另一个作为客户端。 我正在连接到我的本地 IP 127.0.0.1。

大约 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;
}

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

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

在您的服务器代码中, 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;
}

与服务器调用socket.receive()socket.send()if语句相同。

如果socket.send()socket.receive()失败,您的客户端代码不会输出任何错误消息,这些if语句在其主体中执行单个语句(即,只是return ),因此大括号是可选的。

问题是ifreturn的格式。 按 Ctrl+Shift+K 后,代码再次格式化并且可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM