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; }
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; g_config->getOption("SDL.NetworkIP", &server); g_config->getOption("SDL.NetworkUsername", &username); g_config->getOption("SDL.NetworkPassword", &password); g_config->getOption("SDL.NetworkGameKey", &key); g_config->getOption("SDL.NetworkPort", &port); g_config->getOption("SDL.NetworkPlayers", &localPlayers); g_config->setOption("SDL.NetworkIP", ""); g_config->setOption("SDL.NetworkPassword", ""); g_config->setOption("SDL.NetworkGameKey", ""); // only initialize if remote server is specified if(!server.size()) { return 0; } TSocket = socket(AF_INET, SOCK_STREAM, 0); if(TSocket < 0) { 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; #ifdef BEOS error = setsockopt(TSocket, SOL_SOCKET, TCP_NODELAY, &tcpopt, sizeof(int)); #elif WIN32 error = setsockopt(TSocket, SOL_TCP, TCP_NODELAY, (char*)&tcpopt, sizeof(int)); #else error = setsockopt(TSocket, SOL_TCP, TCP_NODELAY, &tcpopt, sizeof(int)); #endif 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 { 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); close(TSocket); FCEUD_NetworkClose(); return(0); } memcpy(&sockin.sin_addr, phostentb->h_addr, phostentb->h_length); } 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); close(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 *)FCEU_dmalloc(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()); } #ifdef WIN32 send(s_Socket, (char*)sendbuf, sblen, 0); #else send(s_Socket, sendbuf, sblen, 0); #endif FCEU_dfree(sendbuf); #ifdef WIN32 recv(s_Socket, (char*)buf, 1, 0); #else recv(s_Socket, buf, 1, MSG_WAITALL); #endif netdivisor = buf[0]; puts("*** Connection established."); FCEU_DispMessage("Connection established.",0); FCEUDnetplay = 1; FCEUI_NetplayStart(localPlayers, netdivisor); return 1; }
int FCEUD_NetworkConnect(void) { WSADATA WSAData; SOCKADDR_IN sockin; /* I want to play with fighting robots. */ /* clack clack clack razzzzzzzzzz */ SOCKET TSocket; int netdivisor; if(WSAStartup(MAKEWORD(1,1),&WSAData)) { NetStatAdd("*** Error initializing WIndows Sockets."); return(0); } wsainit=1; if( (TSocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET) { WSE("Error creating stream socket."); FCEUD_NetworkClose(); return(0); } memset(&sockin,0,sizeof(sockin)); sockin.sin_family=AF_INET; { struct hostent *phostentb; unsigned long hadr; int sockin_len; sockin.sin_port=0; sockin.sin_addr.s_addr=INADDR_ANY; sockin_len=sizeof(sockin); hadr=inet_addr(netplayhost); if(hadr!=INADDR_NONE) sockin.sin_addr.s_addr=hadr; else { NetStatAdd("*** Looking up host name..."); if(!(phostentb=gethostbyname((const char *)netplayhost))) { WSE("Error getting host network information."); closesocket(TSocket); FCEUD_NetworkClose(); return(0); } memcpy((char *)&sockin.sin_addr,((PHOSTENT)phostentb)->h_addr,((PHOSTENT)phostentb)->h_length); } sockin.sin_port=htons(remotetport); NetStatAdd("*** Connecting to remote host..."); if(connect(TSocket,(PSOCKADDR)&sockin,sizeof(sockin))==SOCKET_ERROR) { WSE("Error connecting to remote host."); closesocket(TSocket); FCEUD_NetworkClose(); return(0); } Socket=TSocket; NetStatAdd("*** Sending initialization data to server..."); { uint8 *sendbuf; uint8 buf[1]; uint32 sblen; sblen = 4 + 16 + 16 + 64 + 1 + (netplaynick?strlen(netplaynick):0); sendbuf = (uint8*)malloc(sblen); //mbg merge 7/17/06 added cast memset(sendbuf, 0, sblen); en32(sendbuf, sblen - 4); if(netgamekey) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, (uint8*)&GameInfo->MD5.data, 16); md5_update(&md5, (uint8*)netgamekey, strlen(netgamekey)); //mbg merge 7/17/06 added cast md5_finish(&md5, md5out); memcpy(sendbuf + 4, md5out, 16); } else memcpy(sendbuf + 4, &GameInfo->MD5, 16); if(netpassword) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, (uint8*)netpassword, strlen(netpassword)); //mbg merge 7/17/06 added cast md5_finish(&md5, md5out); memcpy(sendbuf + 4 + 16, md5out, 16); } memset(sendbuf + 4 + 16 + 16, 0, 64); sendbuf[4 + 16 + 16 + 64] = netlocalplayers; if(netplaynick) memcpy(sendbuf + 4 + 16 + 16 + 64 + 1,netplaynick,strlen(netplaynick)); send(Socket, (char*)sendbuf, sblen, 0); //mbg merge 7/17/06 added cast free(sendbuf); recv_tcpwrap(buf, 1); netdivisor = buf[0]; } } FCEUI_NetplayStart(netlocalplayers,netdivisor); NetStatAdd("*** Connection established."); FCEUDnetplay = 1; char tcpopt = 1; //mbg merge 7/17/06 changed to char if(setsockopt(TSocket, IPPROTO_TCP, TCP_NODELAY, &tcpopt, sizeof(int))) puts("Nodelay fail"); return(1); }
/* static uint32 de32(uint8 *morp) { return(morp[0]|(morp[1]<<8)|(morp[2]<<16)|(morp[3]<<24)); } */ int FCEUD_NetworkConnect(void) { struct sockaddr_in sockin; /* I want to play with fighting robots. */ struct hostent *phostentb; unsigned long hadr; int TSocket; int netdivisor; if(!netplayhost) return(0); if( (TSocket=socket(AF_INET,SOCK_STREAM,0))==-1) { puts("Error creating stream socket."); FCEUD_NetworkClose(); return(0); } int tcpopt = 1; if(setsockopt(TSocket, SOL_TCP, TCP_NODELAY, &tcpopt, sizeof(int))) puts("Nodelay fail"); memset(&sockin,0,sizeof(sockin)); sockin.sin_family=AF_INET; hadr=inet_addr(netplayhost); if(hadr!=INADDR_NONE) sockin.sin_addr.s_addr=hadr; else { puts("*** Looking up host name..."); if(!(phostentb=gethostbyname((const char *)netplayhost))) { puts("Error getting host network information."); close(TSocket); FCEUD_NetworkClose(); return(0); } memcpy(&sockin.sin_addr,phostentb->h_addr,phostentb->h_length); } sockin.sin_port=htons(tport); puts("*** Connecting to remote host..."); if(connect(TSocket,(struct sockaddr *)&sockin,sizeof(sockin))==-1) { puts("Error connecting to remote host."); close(TSocket); FCEUD_NetworkClose(); return(0); } Socket=TSocket; puts("*** Sending initialization data to server..."); { uint8 *sendbuf; uint8 buf[5]; uint32 sblen; sblen = 4 + 16 + 16 + 64 + 1 + (netplaynick?strlen(netplaynick):0); sendbuf = malloc(sblen); memset(sendbuf, 0, sblen); en32(sendbuf, sblen - 4); if(netgamekey) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, CurGame->MD5, 16); md5_update(&md5, netgamekey, strlen(netgamekey)); md5_finish(&md5, md5out); memcpy(sendbuf + 4, md5out, 16); } else memcpy(sendbuf + 4, CurGame->MD5, 16); if(netpassword) { struct md5_context md5; uint8 md5out[16]; md5_starts(&md5); md5_update(&md5, netpassword, strlen(netpassword)); md5_finish(&md5, md5out); memcpy(sendbuf + 4 + 16, md5out, 16); } memset(sendbuf + 4 + 16 + 16, 0, 64); sendbuf[4 + 16 + 16 + 64] = netlocalplayers; if(netplaynick) memcpy(sendbuf + 4 + 16 + 16 + 64 + 1,netplaynick,strlen(netplaynick)); send(Socket, sendbuf, sblen, 0); free(sendbuf); recv(Socket, buf, 1, MSG_WAITALL); netdivisor = buf[0]; } puts("*** Connection established."); FCEUDnetplay = 1; FCEUI_NetplayStart(netlocalplayers, netdivisor); return(1); }