为什么我在尝试使用SFML将我的UDP套接字绑定到端口时出现错误?
问题描述:
我目前正在使用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;
}
答
在您的服务器代码中,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
),所以括号是可选的。
答
您的服务器最有可能关闭没有正确关闭端口。 如果您等待几分钟,端口将可以再次免费使用(在我的Ubuntu 16.04系统上需要大约2-3分钟,可能会有所不同,具体取决于您使用的操作系统)
或者,您可以更改端口使用。
定义'崩溃'。错误是什么? – EJP
它只是返回。 这部分是它失败的地方: if(socket.bind(port)!= sf :: Socket :: Done) std :: cout Mick
因此,打印错误并告诉我们它是什么。这里还没有有用的信息。 – EJP