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

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

本文关键字:为什么 错误 遇到 SFML UDP 套接字 绑定      更新时间:2023-10-16

我当前使用UDP构建了用于SFML的网络原型。我创建了一个应用程序,您可以选择成为服务器或客户端。因此,通常我启动了应用程序的2个实例,让一个是服务器,另一个是客户端。我要连接到本地IP 127.0.0.1。

大约20分钟前,这个精确的代码奏效了,我对此没有任何问题。我什么都没有更改,但是此代码不再起作用,当我为服务器调用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;
}

在您的服务器代码中,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),因此括号是可选的。

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

另外,您可以更改所使用的端口。

问题是if S和return s的格式。击中 ctrl shift k 后,代码再次格式化并起作用。

相关文章: