C++ 为什么我在尝试使用SFML将UDP套接字绑定到端口时出错?
我目前正在使用UDP为SFML构建一个网络原型。我已经创建了一个应用程序,您可以在其中选择作为服务器或客户端。因此,通常我会启动应用程序的两个实例,一个是服务器,另一个是客户端。我正在连接到我的本地IP 127.0.0.1 大约20分钟前,这个精确的代码工作了,我对它没有任何问题。我没有更改任何内容,但此代码不再工作,当我为服务器调用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
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
在assocket.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;
}