【发布时间】:2017-01-19 02:07:34
【问题描述】:
我在使用 UDP 和 SFML 的客户端-服务器连接方面遇到了一些奇怪的问题,我慢慢地想不出可能出了什么问题,所以也许有人可以帮助我。
目前我可以将客户端连接到服务器并将消息从服务器发送到客户端。当我杀死客户端应用程序并再次重新启动它(在同一台机器上)时,提供相同的服务器连接参数,没有任何反应。看起来好像没有建立连接。客户端只是在等待消息表单服务器,而服务器同时不断地发送消息。
我的服务器端是这样的:
std::shared_ptr<sf::UdpSocket> startUdpServer()
{
std::cout << "Local address: ";
std::cout << sf::IpAddress::getLocalAddress().toString() << std::endl;
std::cout << "Public address: ";
std::cout << sf::IpAddress::getPublicAddress().toString() << std::endl;
std::shared_ptr<sf::UdpSocket> socket(new sf::UdpSocket());
if(socket->bind(sf::Socket::AnyPort) != sf::Socket::Done)
return nullptr;
std::cout << "Server is listening to port " << socket->getLocalPort() << ", waiting for a message... " << std::endl;
return socket;
}
std::pair<sf::IpAddress, unsigned short> runUdpServer(std::shared_ptr<sf::UdpSocket> socket)
{
// Wait for a message
char in[128];
std::size_t received;
sf::IpAddress sender;
unsigned short senderPort;
if (socket->receive(in, sizeof(in), received, sender, senderPort) != sf::Socket::Done)
{
std::cout << "Connection error" << std::endl;
return std::make_pair(sender, senderPort);
}
std::cout << "Message received from client " << sender << ": \"" << in << "\"" << std::endl;
return std::make_pair(sender, senderPort);
}
void sendUdpMessage(std::shared_ptr<sf::UdpSocket> socket, std::pair<sf::IpAddress, unsigned short> config,
std::string message)
{
const char* out = message.c_str();
if (socket->send(out, sizeof(char) * message.length(), config.first, config.second) != sf::Socket::Done)
{
std::cout << "Message not send" << std::endl;
return;
}
}
void sendMessages(std::shared_ptr<sf::UdpSocket> socket, std::pair<sf::IpAddress, unsigned short> config)
{
if(config.first != sf::IpAddress::None)
{
while(true)
sendUdpMessage(socket,config,"Test msg");
}
else
std::cout << "Message sending error" << std::endl;
}
auto socket = startUdpServer();
auto config = runUdpServer(socket);
std::thread messages_thread(sendMessages,socket,config);
和我的客户:
std::shared_ptr<sf::UdpSocket> startUdpClient()
{
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);
unsigned short port;
std::cout << "Type the port number: ";
std::cin >> port;
std::shared_ptr<sf::UdpSocket> socket(new sf::UdpSocket());
sf::Packet packet;
const char out[] = "Hi, I'm a client";
if (socket->send(out, sizeof(out), server, port) != sf::Socket::Done)
return nullptr;
return socket;
}
void runUdpClient(std::shared_ptr<sf::UdpSocket> socket)
{
char in[256];
std::size_t received;
sf::IpAddress sender;
unsigned short senderPort;
if (socket->receive(in, sizeof(in), received, sender, senderPort) != sf::Socket::Done)
return;
std::cout << "Message received: \"" << in << "\"" << std::endl;
}
auto socketUDP = startUdpClient();
std::thread messagesThread(receiveMessages,socketUDP);
void receiveMessages(std::shared_ptr<sf::UdpSocket> socket)
{
while(true)
runUdpClient(socket);
}
【问题讨论】:
-
当你重新启动客户端时,你是在告诉它监听它之前监听的同一个端口吗?
-
你在哪里绑定你客户端的端口?
-
@Eddge 1. 是的,我为它提供了相同的数据。 2.我才意识到,我只是绑定服务器。然而,客户正在工作(不过只有一次)。
-
我敢打赌,如果您在客户端上绑定了端口,并且每次都将其重新绑定到同一个端口,因为您正在创建一个 UdpSocket。当您关闭客户端时,请确保它也删除了与端口的绑定。
-
如果您在同一服务器端口上向服务器发送消息,则无法保证您的客户端在创建其 udpsocket 时每次都使用相同的端口(客户端),您可以通过打印进行测试发送数据时使用的端口。