more reliable connection process

This commit is contained in:
Arisotura 2023-09-10 10:53:52 +02:00
parent 9846ee3770
commit db886e5eb3
1 changed files with 46 additions and 27 deletions

View File

@ -164,15 +164,18 @@ void LANStartClientDialog::onDirectConnect()
std::string hostname = host.toStdString(); std::string hostname = host.toStdString();
std::string player = ui->txtPlayerName->text().toStdString(); std::string player = ui->txtPlayerName->text().toStdString();
setEnabled(false);
LAN::EndDiscovery(); LAN::EndDiscovery();
if (!LAN::StartClient(player.c_str(), hostname.c_str())) if (!LAN::StartClient(player.c_str(), hostname.c_str()))
{ {
QString msg = QString("Failed to connect to the host %0.").arg(QString::fromStdString(hostname)); QString msg = QString("Failed to connect to the host %0.").arg(QString::fromStdString(hostname));
QMessageBox::warning(this, "melonDS", msg); QMessageBox::warning(this, "melonDS", msg);
setEnabled(true);
LAN::StartDiscovery(); LAN::StartDiscovery();
return; return;
} }
setEnabled(true);
lanDlg = LANDialog::openDlg(parentWidget()); lanDlg = LANDialog::openDlg(parentWidget());
QDialog::done(QDialog::Accepted); QDialog::done(QDialog::Accepted);
} }
@ -198,15 +201,18 @@ void LANStartClientDialog::done(int r)
std::string player = ui->txtPlayerName->text().toStdString(); std::string player = ui->txtPlayerName->text().toStdString();
setEnabled(false);
LAN::EndDiscovery(); LAN::EndDiscovery();
if (!LAN::StartClient(player.c_str(), hostname)) if (!LAN::StartClient(player.c_str(), hostname))
{ {
QString msg = QString("Failed to connect to the host %0.").arg(QString(hostname)); QString msg = QString("Failed to connect to the host %0.").arg(QString(hostname));
QMessageBox::warning(this, "melonDS", msg); QMessageBox::warning(this, "melonDS", msg);
setEnabled(true);
LAN::StartDiscovery(); LAN::StartDiscovery();
return; return;
} }
setEnabled(true);
lanDlg = LANDialog::openDlg(parentWidget()); lanDlg = LANDialog::openDlg(parentWidget());
} }
else else
@ -548,17 +554,52 @@ bool StartClient(const char* playername, const char* host)
return false; return false;
} }
Player* player = &MyPlayer;
memset(player, 0, sizeof(Player));
player->ID = 0;
strncpy(player->Name, playername, 31);
player->Status = 3;
ENetEvent event; ENetEvent event;
bool conn = false; int conn = 0;
if (enet_host_service(Host, &event, 5000) > 0) u32 starttick = SDL_GetTicks();
const u32 conntimeout = 5000;
for (;;)
{ {
if (event.type == ENET_EVENT_TYPE_CONNECT) u32 curtick = SDL_GetTicks();
u32 timeout = conntimeout - (curtick - starttick);
if (enet_host_service(Host, &event, timeout) > 0)
{ {
conn = true; if (conn == 0 && event.type == ENET_EVENT_TYPE_CONNECT)
{
conn = 1;
}
else if (conn == 1 && event.type == ENET_EVENT_TYPE_RECEIVE)
{
u8* data = event.packet->data;
if (event.channelID != 0) continue;
if (data[0] != 0x01) continue;
if (event.packet->dataLength != 3) continue;
MaxPlayers = data[2];
// send player information
MyPlayer.ID = data[1];
u8 cmd[1+sizeof(Player)];
cmd[0] = 0x02;
memcpy(&cmd[1], &MyPlayer, sizeof(Player));
ENetPacket* pkt = enet_packet_create(cmd, 1+sizeof(Player), ENET_PACKET_FLAG_RELIABLE);
enet_peer_send(event.peer, 0, pkt);
conn = 2;
break;
}
} }
else
break;
} }
if (!conn) if (conn != 2)
{ {
enet_peer_reset(peer); enet_peer_reset(peer);
enet_host_destroy(Host); enet_host_destroy(Host);
@ -566,12 +607,6 @@ bool StartClient(const char* playername, const char* host)
return false; return false;
} }
Player* player = &MyPlayer;
memset(player, 0, sizeof(Player));
player->ID = 0;
strncpy(player->Name, playername, 31);
player->Status = 3;
HostAddress = addr.host; HostAddress = addr.host;
LastHostID = -1; LastHostID = -1;
LastHostPeer = nullptr; LastHostPeer = nullptr;
@ -844,22 +879,6 @@ void ProcessClientEvent(ENetEvent& event)
u8* data = (u8*)event.packet->data; u8* data = (u8*)event.packet->data;
switch (data[0]) switch (data[0])
{ {
case 0x01: // host sending player ID
{
if (event.packet->dataLength != 3) break;
MaxPlayers = data[2];
// send player information
MyPlayer.ID = data[1];
u8 cmd[1+sizeof(Player)];
cmd[0] = 0x02;
memcpy(&cmd[1], &MyPlayer, sizeof(Player));
ENetPacket* pkt = enet_packet_create(cmd, 1+sizeof(Player), ENET_PACKET_FLAG_RELIABLE);
enet_peer_send(event.peer, 0, pkt);
}
break;
case 0x03: // host sending player list case 0x03: // host sending player list
{ {
if (event.packet->dataLength != (2+sizeof(Players))) break; if (event.packet->dataLength != (2+sizeof(Players))) break;