C++ 为什么我在尝试使用SFML将UDP套接字绑定到端口时出错?

C++ 为什么我在尝试使用SFML将UDP套接字绑定到端口时出错?,c++,sockets,network-programming,udp,sfml,C++,Sockets,Network Programming,Udp,Sfml,我目前正在使用UDP为SFML构建一个网络原型。我已经创建了一个应用程序,您可以在其中选择作为服务器或客户端。因此,通常我会启动应用程序的两个实例,一个是服务器,另一个是客户端。我正在连接到我的本地IP 127.0.0.1 大约20分钟前,这个精确的代码工作了,我对它没有任何问题。我没有更改任何内容,但此代码不再工作,当我为服务器调用socket.bind()时,程序崩溃。客户端,没有显示错误 这是用C++做的。< /P> 有人知道可能的原因吗?据我所知,这个端口也没有被使用 我的客户代码: v

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

大约20分钟前,这个精确的代码工作了,我对它没有任何问题。我没有更改任何内容,但此代码不再工作,当我为服务器调用
socket.bind()
时,程序崩溃。客户端,没有显示错误

这是用C++做的。< /P> 有人知道可能的原因吗?据我所知,这个端口也没有被使用

我的客户代码:

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 runUdpClient(未签名的短端口){
sf::IP地址服务器;
做
{
std::cout>服务器;
}而(服务器==sf::IpAddress::无);
sf::UdpSocket插座;
sf::packetclientsendpacket;
std::string packetSendContent=“来自客户端的数据包”;

clientSendPacket您的服务器很可能在未正确关闭端口的情况下关闭。 如果您稍等几分钟,端口将可以再次免费使用(在我的Ubuntu 16.04系统上大约需要2-3分钟,可能会因您使用的操作系统而异)


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

问题在于
if
s和
return
s的格式问题。在按住Ctrl+Shift+K键后,代码再次格式化并正常工作。

在服务器代码中,
if
语句缺少大括号,因此您总是这样执行
return
在as
socket.bind()
上,无论成功还是失败都会退出。此代码:

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(socket.bind(port)!=sf::socket::Done)std::cout So打印错误并告诉我们它是什么。这里还没有有用的信息。它不会打印错误,因为它只是捕获了错误。当套接字绑定失败时,它会从函数中返回。它不会打印任何错误,因为您没有正确编写代码。打印您自己的错误消息并抑制真正的错误错误完全是浪费时间。任何系统调用失败后的错误都可以在
errno
中找到,并且可以用
perror()打印为文本
。这是非常基本的。不幸的是,更改端口对我没有帮助。我已经等了大约15分钟,但没有帮助。我正在使用windows 10。我正在考虑尽快重新启动我的电脑,看看是否有帮助。你可以尝试执行socket.bind(sf::socket::AnyPort)然后看看这是否有效。如果有效,则可以通过调用socket.getLocalPort()获取端口。格式化des不会更改可执行代码的语义。您修复了其他问题。
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;
if (socket.bind(port) != sf::Socket::Done)
{
    std::cout << "Error binding socket for server";
    return;
}