bool Net::init() { #if defined(TORQUE_USE_WINSOCK) if(!initCount) { #ifdef TORQUE_OS_XENON // Configure startup parameters XNetStartupParams xnsp; memset( &xnsp, 0, sizeof( xnsp ) ); xnsp.cfgSizeOfStruct = sizeof( XNetStartupParams ); #ifndef TORQUE_DISABLE_PC_CONNECTIVITY xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; Con::warnf("XNET_STARTUP_BYPASS_SECURITY enabled! This build can talk to PCs!"); #endif AssertISV( !XNetStartup( &xnsp ), "Net::init - failed to init XNet" ); #endif WSADATA stWSAData; AssertISV( !WSAStartup( 0x0101, &stWSAData ), "Net::init - failed to init WinSock!" ); //logprintf("Winsock initialization %s", success ? "succeeded." : "failed!"); } #endif initCount++; Process::notify(&Net::process, PROCESS_NET_ORDER); return(true); }
//--------------------------------------------------------------------- // 开始网络 //--------------------------------------------------------------------- int apr_netstart(void) { #if defined(_WIN32) || defined(WIN32) static int inited = 0; WSADATA WSAData; int retval = 0; #ifdef _XBOX XNetStartupParams xnsp; #endif if (inited == 0) { #ifdef _XBOX memset(&xnsp, 0, sizeof(xnsp)); xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams); xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; XNetStartup(&xnsp); #endif retval = WSAStartup(0x202, &WSAData); if (WSAData.wVersion != 0x202) { WSACleanup(); fprintf(stderr, "WSAStartup failed !!\n"); fflush(stderr); return -1; } inited = 1; } #endif return 0; }
/* ==================== NET_Init ==================== */ void NET_Init( void ) { int r; #ifdef _XBOX // Run NetStartup with security bypassed // this allows us to communicate with PCs while developing XNetStartupParams xnsp; ZeroMemory( &xnsp, sizeof(xnsp) ); xnsp.cfgSizeOfStruct = sizeof(xnsp); #ifdef _DEBUG xnsp.cfgFlags |= XNET_STARTUP_BYPASS_SECURITY; #else xnsp.cfgFlags |= XNET_STARTUP_BYPASS_SECURITY; // xnsp.cfgFlags = 0; #endif INT err = XNetStartup( &xnsp ); #endif r = WSAStartup( MAKEWORD( 1, 1 ), &winsockdata ); if( r ) { Com_Printf( "WARNING: Winsock initialization failed, returned %d\n", r ); return; } winsockInitialized = qtrue; Com_Printf( "Winsock Initialized\n" ); // this is really just to get the cvars registered NET_GetCvars(); //FIXME testing! NET_Config( qtrue ); }
/*-------------------------------------------------------------------------*\ * Initializes module \*-------------------------------------------------------------------------*/ int socket_open(void) { WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2, 0); int err = 0; #ifdef _XBOX XNetStartupParams xnsp; XNADDR g_xnaddr; // our own XNADDR DWORD dwRet; memset(&xnsp, 0, sizeof(xnsp)); xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams); xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; err = XNetStartup(&xnsp); if (err == 0) { OutputDebugStringA("PE: PROGRESS: XNetStartupParams Succeeded\n"); } else { OutputDebugStringA("PE: ERROR: XNetStartupParams Failed\n"); } do { dwRet = XNetGetTitleXnAddr( &g_xnaddr ); } while( dwRet == XNET_GET_XNADDR_PENDING ); OutputDebugStringA("Machine IP Address is :"); printf( " XNADDR: %02X:%02X:%02X:%02X:%02X:%02X\n", g_xnaddr.abEnet[0], g_xnaddr.abEnet[1], g_xnaddr.abEnet[2], g_xnaddr.abEnet[3], g_xnaddr.abEnet[4], g_xnaddr.abEnet[5] ); do { dwRet = XNetGetDebugXnAddr( &g_xnaddr ); } while( dwRet == XNET_GET_XNADDR_PENDING ); printf( " Debug XNADDR: %02X:%02X:%02X:%02X:%02X:%02X\n", g_xnaddr.abEnet[0], g_xnaddr.abEnet[1], g_xnaddr.abEnet[2], g_xnaddr.abEnet[3], g_xnaddr.abEnet[4], g_xnaddr.abEnet[5] ); #endif err = WSAStartup(wVersionRequested, &wsaData ); if (err != 0) return 0; if ((LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) && (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)) { WSACleanup(); return 0; } return 1; }
/* ============== Sys_PlatformInit Windows specific initialisation ============== */ void Sys_PlatformInit( void ) { #ifdef _XBOX // allow unsecure socket INT err; XNetStartupParams xnsp; memset(&xnsp, 0, sizeof(xnsp)); xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams); xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; err = XNetStartup(&xnsp); #endif Sys_SetFloatEnv(); }
// // InitNet // void Xbox::InitNet() { XNetStartupParams xnsp; ZeroMemory( &xnsp, sizeof(xnsp) ); xnsp.cfgSizeOfStruct = sizeof(xnsp); xnsp.cfgPrivatePoolSizeInPages = 64; // == 256kb, default = 12 (48kb) xnsp.cfgEnetReceiveQueueLength = 16; // == 32kb, default = 8 (16kb) xnsp.cfgIpFragMaxSimultaneous = 16; // default = 4 xnsp.cfgIpFragMaxPacketDiv256 = 32; // == 8kb, default = 8 (2kb) xnsp.cfgSockMaxSockets = 64; // default = 64 xnsp.cfgSockDefaultRecvBufsizeInK = 128; // default = 16 xnsp.cfgSockDefaultSendBufsizeInK = 128; // default = 16 // Bypass security so we can talk to the outside world as we please xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; XNetStartup( &xnsp ); }
int InitWSA() { #if defined(_XBOX) if(XNetStartup(NULL) != 0) { LOG.Write("Failed to Startup XNet"); } #endif WSADATA wsa; int res = WSAStartup(MAKEWORD(2,2), &wsa); if(res != 0) { res = WSAGetLastError(); LOG.Write("WSAStartup failed : %d\n", res); } LOG<<"WSA initialized\n"; return res; }
int FCEUD_NetworkConnect(void) { struct sockaddr_in sockin; struct hostent *phostentb; unsigned long hadr; int TSocket, tcpopt, error; int netdivisor; // get any required configuration variables int port, localPlayers; std::string server, username, password, key; server = "192.168.0.12"; username = "******"; password = ""; key = ""; port = 4046; localPlayers = 2; // only initialize if remote server is specified if(!server.size()) { return 0; } XNetStartupParams xnsp; memset(&xnsp, 0, sizeof(xnsp)); xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams); xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; xnsp.cfgSockDefaultRecvBufsizeInK = 16; // default = 16 xnsp.cfgSockDefaultSendBufsizeInK = 16; // default = 16 INT iResult = XNetStartup( &xnsp ); WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 2 ); WSAStartup( wVersionRequested, &wsaData ); TSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(TSocket < 0) { DWORD err = GetLastError(); char* s = "Error creating stream socket."; puts(s); FCEU_DispMessage(s,0); FCEUD_NetworkClose(); return 0; } // try to setup TCP_NODELAY to avoid network jitters tcpopt = 1; error = setsockopt(TSocket, SOL_TCP, TCP_NODELAY, (char*)&tcpopt, sizeof(int)); if(error) { puts("Nodelay fail"); } memset(&sockin, 0, sizeof(sockin)); sockin.sin_family = AF_INET; hadr = inet_addr(server.c_str()); if(hadr != INADDR_NONE) { sockin.sin_addr.s_addr = hadr; } else { #if 0 //marche pas puts("*** Looking up host name..."); //phostentb = gethostbyname(server.c_str()); if(!phostentb) { puts("Error getting host network information."); FCEU_DispMessage("Error getting host info",0); closesocket(TSocket); FCEUD_NetworkClose(); return(0); } memcpy(&sockin.sin_addr, phostentb->h_addr, phostentb->h_length); #endif } sockin.sin_port = htons(port); puts("*** Connecting to remote host..."); error = connect(TSocket, (struct sockaddr *)&sockin, sizeof(sockin)); if(error < 0) { puts("Error connecting to remote host."); FCEU_DispMessage("Error connecting to server",0); closesocket(TSocket); FCEUD_NetworkClose(); return 0; } s_Socket = TSocket; puts("*** Sending initialization data to server..."); uint8 *sendbuf; uint8 buf[5]; uint32 sblen; sblen = 4 + 16 + 16 + 64 + 1 + username.size(); sendbuf = (uint8 *)malloc(sblen); memset(sendbuf, 0, sblen); // XXX soules - should use htons instead of en32() from above! //uint32 data = htons(sblen - 4); //memcpy(sendbuf, &data, sizeof(data)); en32(sendbuf, sblen - 4); if(key.size()) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, (uint8*)&GameInfo->MD5.data, 16); md5_update(&md5, (uint8 *)key.c_str(), key.size()); md5_finish(&md5, md5out); memcpy(sendbuf + 4, md5out, 16); } else { memcpy(sendbuf + 4, (uint8*)&GameInfo->MD5.data, 16); } if(password.size()) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, (uint8 *)password.c_str(), password.size()); md5_finish(&md5, md5out); memcpy(sendbuf + 4 + 16, md5out, 16); } memset(sendbuf + 4 + 16 + 16, 0, 64); sendbuf[4 + 16 + 16 + 64] = (uint8)localPlayers; if(username.size()) { memcpy(sendbuf + 4 + 16 + 16 + 64 + 1, username.c_str(), username.size()); } send(s_Socket, (char*)sendbuf, sblen, 0); free(sendbuf); recv(s_Socket, (char*)buf, 1, 0); netdivisor = buf[0]; puts("*** Connection established."); FCEU_DispMessage("Connection established.",0); FCEUDnetplay = 1; FCEUI_NetplayStart(localPlayers, netdivisor); return 1; }
//--------------------------------------------------------------------- // InitializeNetwork // // Thanks to XBoxMediaPlayer for this code! //--------------------------------------------------------------------- BOOL InitializeNetwork( void ) { g_szTitleIPAddr[0] = 0; if (!IsEthernetConnected()) return FALSE; // if local address is specified if ((!g_NetworkConfig.m_IPAddr.IsEmpty()) && (!g_NetworkConfig.m_SubnetMask.IsEmpty()) && (!g_NetworkConfig.m_Gateway.IsEmpty())) { // Thanks and credits to Team Evox for the description of the // XNetConfigParams structure. TXNetConfigParams configParams; PRINTMSG(( T_INFO, "Loading network configuration..." )); XNetLoadConfigParams( (LPBYTE) &configParams ); PRINTMSG(( T_INFO, "Ready." )); BOOL bXboxVersion2 = (configParams.V2_Tag == 0x58425632 ); // "XBV2" BOOL bDirty = FALSE; PRINTMSG(( T_INFO, "User local address: %s", g_NetworkConfig.m_IPAddr.c_str() )); if (bXboxVersion2) { if (configParams.V2_IP != inet_addr(g_NetworkConfig.m_IPAddr.c_str())) { configParams.V2_IP = inet_addr(g_NetworkConfig.m_IPAddr.c_str()); bDirty = TRUE; } } else { if (configParams.V1_IP != inet_addr(g_NetworkConfig.m_IPAddr.c_str())) { configParams.V1_IP = inet_addr(g_NetworkConfig.m_IPAddr.c_str()); bDirty = TRUE; } } PRINTMSG(( T_INFO, "User subnet mask: %s", g_NetworkConfig.m_SubnetMask.c_str() )); if (bXboxVersion2) { if (configParams.V2_Subnetmask != inet_addr(g_NetworkConfig.m_SubnetMask.c_str())) { configParams.V2_Subnetmask = inet_addr(g_NetworkConfig.m_SubnetMask.c_str()); bDirty = TRUE; } } else { if (configParams.V1_Subnetmask != inet_addr(g_NetworkConfig.m_SubnetMask.c_str())) { configParams.V1_Subnetmask = inet_addr(g_NetworkConfig.m_SubnetMask.c_str()); bDirty = TRUE; } } PRINTMSG(( T_INFO, "User gateway address: %s", g_NetworkConfig.m_Gateway.c_str() )); if (bXboxVersion2) { if (configParams.V2_Defaultgateway != inet_addr(g_NetworkConfig.m_Gateway.c_str())) { configParams.V2_Defaultgateway = inet_addr(g_NetworkConfig.m_Gateway.c_str()); bDirty = TRUE; } } else { if (configParams.V1_Defaultgateway != inet_addr(g_NetworkConfig.m_Gateway.c_str())) { configParams.V1_Defaultgateway = inet_addr(g_NetworkConfig.m_Gateway.c_str()); bDirty = TRUE; } } if (configParams.Flag != (0x04|0x08) ) { configParams.Flag = 0x04 | 0x08; bDirty = TRUE; } if (bDirty) { PRINTMSG(( T_INFO, "Updating network configuration...")); XNetSaveConfigParams( (LPBYTE) &configParams ); PRINTMSG(( T_INFO, "Ready." )); } } XNetStartupParams xnsp; memset(&xnsp, 0, sizeof(xnsp)); xnsp.cfgSizeOfStruct = sizeof(XNetStartupParams); // Bypass security so that we may connect to 'untrusted' hosts xnsp.cfgFlags = XNET_STARTUP_BYPASS_SECURITY; // create more memory for networking xnsp.cfgPrivatePoolSizeInPages = 64; // == 256kb, default = 12 (48kb) xnsp.cfgEnetReceiveQueueLength = 16; // == 32kb, default = 8 (16kb) xnsp.cfgIpFragMaxSimultaneous = 16; // default = 4 xnsp.cfgIpFragMaxPacketDiv256 = 32; // == 8kb, default = 8 (2kb) xnsp.cfgSockMaxSockets = 64; // default = 64 xnsp.cfgSockDefaultRecvBufsizeInK = 128; // default = 16 xnsp.cfgSockDefaultSendBufsizeInK = 128; // default = 16 INT err = XNetStartup(&xnsp); XNADDR xna; DWORD dwState; do { dwState = XNetGetTitleXnAddr(&xna); Sleep(50); } while (dwState==XNET_GET_XNADDR_PENDING); // Convert the addr to a string XNetInAddrToString(xna.ina, g_szTitleIPAddr.GetBuffer(32), 32); WSADATA WsaData; err = WSAStartup( MAKEWORD(2,2), &WsaData ); return ( err == NO_ERROR ); }