当我尝试将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分钟前,这个精确的代码奏效了,我对此没有任何问题。我什么都没有更改,但是此代码不再起作用,当我为服务器调用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 后,代码再次格式化并起作用。
相关文章:
- 我的字符计数代码计算错误.为什么
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么加载SDF会导致Mobilizer创建闭环错误
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 为什么我在使用void函数时得到错误代码C2276
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么g++在未执行的代码处标记强制转换错误
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 为什么错误"permission denied","id returned 1 exit status"仅在 IM 使用 C++ 中的头文件 fstream 时才出现
- 为什么错误:"locate_zone"不是"std::chrono"的成员
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 为什么错误1400无效的窗口句柄
- 为什么错误LNK2001:在这种情况下未解析的外部符号
- c++为什么错误:no match for 'operator='
- 为什么错误"invalid conversion from 'char' to 'const char*"?