/* Be careful where these MakeXXX() functions are used. */ static uint8 *MakeUDP(uint8 *data, int32 len) { /* UDP packet data header is 12 bytes in length. */ static uint8 buf[12+32]; // arbitrary 32. en32(buf+4,magic); en32(buf+8,outcounter); memcpy(buf+12,data,len); en32(buf,FCEUI_CRC32(0,buf+4,8+len)); return(buf); }
static uint8 *MakeTCP(uint8 *data, int32 len) { /* TCP packet data header is 4 bytes in length. */ static uint8 buf[4+32]; // arbitrary 32. en32(buf,outcounter); memcpy(buf+4,data,len); return(buf); }
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) { 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); }
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) { IPaddress rip; SDLNet_Init(); int netplay =1; if(netplay==1) /* Be a server. */ { TCPsocket tmp; Uint16 p=LocalPortUDP; SDLNet_ResolveHost(&rip,NULL,LocalPortTCP); UDPSocket=SDLNet_UDP_Open(p); tmp=SDLNet_TCP_Open(&rip); Socket=SDLNet_TCP_Accept(tmp); memcpy(&rip,SDLNet_TCP_GetPeerAddress(Socket),sizeof(IPaddress)); { Uint32 buf[12]; uint32 player=1; magic=SDL_GetTicks(); SDLNet_Write32(buf,uport); SDLNet_Write32(buf+4,1); SDLNet_Write32(buf+8,magic); SDLNet_TCP_Send(Socket, buf, 12); /* Get the UDP port the client is waiting for data on. */ SDLNet_TCP_Recv(Socket, buf, 2); RemotePortUDP=de32(buf); } } else /* Be a client */ { SDLNet_ResolveHost(&rip,ServerHost,RemotePortTCP); Socket=SDLNet_TCP_Open(&rip); { Uint16 p=LocalPortUDP; uint8 buf[12]; UDPSocket=SDLNet_UDP_Open(p); /* Now, tell the server what local UDP port it should send to. */ en32(buf,p); SDLNet_TCP_Send(Socket, buf, 4); /* Get the UDP port from the server we should send data to. */ SDLNet_TCP_Recv(Socket, buf, 12); RemotePortUDP=de32(buf); magic=de32(buf+8); } set=SDLNet_AllocSocketSet(1); SDLNet_TCP_AddSocket(set,Socket); SDLNet_UDP_AddSocket(set,UDPSocket); } // End client connect code. rip.port=RemotePortUDP; SDLNet_UDP_Bind(UDPSocket, 0, &rip); }
/* 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); }