MainWindow::MainWindow(std::unique_ptr<BootParameters> boot_parameters) : QMainWindow(nullptr) { setWindowTitle(QString::fromStdString(Common::scm_rev_str)); setWindowIcon(Resources::GetAppIcon()); setUnifiedTitleAndToolBarOnMac(true); setAcceptDrops(true); InitControllers(); CreateComponents(); ConnectGameList(); ConnectHost(); ConnectToolBar(); ConnectRenderWidget(); ConnectStack(); ConnectMenuBar(); ConnectHotkeys(); InitCoreCallbacks(); NetPlayInit(); if (boot_parameters) StartGame(std::move(boot_parameters)); }
void reconnect(int nSignal) { int nRet; ErrorLog(TRACE, "SIGUSR2 reconnect..."); //signal(SIGUSR2, reconnect); /* 关闭socket */ close(gnParentSock); /*LINK_CLIENT N*/ UpdShmHostNet(gnShmHostId, LINK_CLIENT, gnCommNum, 'N'); ConnectHost(); ErrorLog(TRACE, "reconnect SUCC"); }
void CycleServers() { if (HubSock == NOSOCKET) { if (currenthub) { if (!currenthub->next) currenthub = ServList; else currenthub = currenthub->next; } else currenthub = ServList; SendUmode(OPERUMODE_Y, "*** Cycling server list"); while (currenthub) { /* Begin connection to server */ if ((HubSock = ConnectHost(currenthub->hostname, currenthub->port)) >= 0) { currenthub->sockfd = HubSock; SetHubConnect(currenthub); break; } else { SendUmode(OPERUMODE_Y, "*** Unable to connect to %s:%d (%s)", currenthub->hostname, currenthub->port, strerror(errno)); HubSock = NOSOCKET; currenthub = currenthub->next; } } /* while (currenthub) */ } /* if (HubSock == NOSOCKET) */ } /* CycleServers() */
DWORD WINAPI PortTransfer_2(LPVOID lParam) { TransferParam<ADDRESS, SOCKET> *ConfigInfo = (TransferParam<ADDRESS, SOCKET> *)lParam; SOCKET ClientSocket, ServerSocket; SOCKINFO socks; ClientSocket = ConfigInfo->LocalData.Pop(); printf("ThreadID: %d ==> Connect to Server...", nTimes); //连接到目标计算机的服务 ServerSocket = ConnectHost(ConfigInfo->GlobalData.szIP, ConfigInfo->GlobalData.wPort); if(ServerSocket <= 0) { printf("Error.\r\n"); closesocket(ClientSocket); return 0; } printf("OK.\r\nStarting TransmitData\r\n", nTimes); socks.ClientSock = ClientSocket;//公网计算机的套接字 socks.ServerSock = ServerSocket;//目标计算机服务的套接字 //进入纯数据转发状态 return TransmitData((LPVOID)&socks); }
BOOL PortTransfer_2(char *szCtrlIP, WORD wCtrlPort, char *szIP, WORD wPort) { int nRecv; int nCount=0; unsigned long lRecv; long nRet; bool fCtrlConnected=false; WORD ReqPort; HANDLE hThread; DWORD dwThreadId; SOCKET CtrlSocket; TransferParam<ADDRESS, SOCKET> ConfigInfo; _snprintf(ConfigInfo.GlobalData.szIP, ADDRSIZE, "%s", szIP); ConfigInfo.GlobalData.wPort = wPort; while(1) { while(!fCtrlConnected){ printf("Creating a ctrlconnection..."); //与PortTransfer_3模式(工作在公网)的计算机建立控制管道连接 CtrlSocket = ConnectHost(szCtrlIP, wCtrlPort); if(CtrlSocket <= 0){ printf("Failed.\r\n"); Sleep(3000); } else{ ConfigInfo.GlobalData.s = CtrlSocket; printf("OK.\r\n"); fCtrlConnected=true; } } //接收来自公网计算机的1byte命令,表示建立一个新通道 nRet=ioctlsocket(CtrlSocket,FIONREAD,&lRecv); if (lRecv>0) { nRecv = recv(CtrlSocket, (char*)&ReqPort, 1, 0); fCtrlConnected=false; nCount=0; if(nRecv <= 0){ closesocket(CtrlSocket); continue; //接收失败 } nTimes++; ConfigInfo.LocalData.Push(CtrlSocket);//传递信息的结构 hThread = CreateThread(NULL, 0, PortTransfer_2, (LPVOID)&ConfigInfo, NULL, &dwThreadId); if(hThread) CloseHandle(hThread); else Sleep(1000); }else{ nCount++; if (nCount>=0x1000) { nCount=send(CtrlSocket,(char *)&nCount,1,0); if (nCount==SOCKET_ERROR) { printf("send error:%d\r\n",WSAGetLastError()); closesocket(CtrlSocket); fCtrlConnected=false; } } } Sleep(2); } //error: printf("Error.\r\n"); closesocket(CtrlSocket); return false; }
SOCKET ConnectHost(char *szIP, WORD wPort) { return ConnectHost(inet_addr(szIP), wPort); }