Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

ANetwork.cpp File Reference


Detailed Description

implements the 'net_' functions in AEngine.h

Definition in file ANetwork.cpp.

#include "AEngine.h"
#include "AUtil.h"
#include "ASharedFunc.h"
#include "AState.h"

Include dependency graph for ANetwork.cpp:

Include dependency graph

Go to the source code of this file.

Functions

NDX_Connect & net_direct ()
void net_runAsServer (string myIP, string myName, int maxNumPlayers)
void net_runAsFakeServer (string myName, int maxNumPlayers)
bool net_connectToServer (string ip, string myName)
void net_acceptMorePlayers ()
void net_broadcast (string &msg)
void net_finalizeGame ()
bool net_amIServer ()
vector< string > net_getAllPlayers ()
void net_send (string msg)
string net_getPlayerName ()
int net_getPlayerNumber ()
void net_disconnect ()
string net_recv ()
int net_getPlayerNumUsingName (string playerName)
string net_getPlayerNameUsingNum (int num)
string net_getSelfIP ()

Variables

GUID netGuid = { 0x809af2bd, 0x7881, 0x468b, { 0xa5, 0x3c, 0x48, 0xd5, 0x48, 0x69, 0x0, 0xd9 } }


Function Documentation

void net_acceptMorePlayers  
 

Definition at line 104 of file ANetwork.cpp.

Referenced by updateMultiplayMenu().

00105 {
00106         if(AS.net_isFakeServer) return;
00107         if(AS.net_gameFinalized) throw Error("Game already finalized.  Can't accept more players");
00108         AS.net_ndxConnect.ScanForPlayers();
00109 }

bool net_amIServer  
 

Definition at line 136 of file ANetwork.cpp.

Referenced by BattleEntry::inputIssueGroupCommand(), BattleEntry::inputIssueJetsCommand(), Overhead::overhead_update(), NetworkSubsystem::processNetworkData(), and updateMultiplayMenu().

00137 {
00138         return AS.net_isServer;
00139 }

void net_broadcast string &    msg
 

Definition at line 112 of file ANetwork.cpp.

Referenced by net_finalizeGame(), and net_recv().

00113 {       
00114         if(AS.net_isFakeServer) return;
00115         AS.net_ndxConnect.Send( DPID_ALLPLAYERS, &msg[0], (DWORD)msg.length()+1 );
00116 }

bool net_connectToServer string    ip,
string    myName
 

Definition at line 65 of file ANetwork.cpp.

References sys_console().

Referenced by updateMultiplayMenu().

00066 {
00067         NDX_Connect &net = AS.net_ndxConnect;
00068         if(!net.Create(&netGuid))
00069         {
00070                 sys_console() << "Can't create DirectPlay" << endl;
00071                 return false;
00072         }
00073 
00074         net.SetGuarenteed(true);
00075         if(!net.ConnectTCPIP( (char*)ip.c_str() ))
00076         {
00077                 sys_console() << "Can't connect to Server : " << ip << endl;
00078                 return false;
00079         }
00080         
00081         net.ScanForGames(20,false);                     // spend 20 millisec searching for a game
00082         if(net.NumGames>0)      
00083         {               
00084                 if(!net.JoinGame(0, (char*)myName.c_str()))
00085                 {
00086                         sys_console() << "Can't Join Game" << endl;
00087                         return false;
00088                 }
00089         }
00090         else 
00091         {
00092                 sys_console() << "No Game Found on that server" << endl;
00093                 return false;
00094         }
00095 
00096         AS.net_isServer = false;
00097         AS.net_myName = myName;
00098         AS.net_serverSendQueue.resize(0);
00099         AS.net_myPlayerNum = -1;
00100         AS.net_isInit = true;
00101         return true;
00102 }

NDX_Connect& net_direct  
 

Definition at line 30 of file ANetwork.cpp.

00031 {
00032         return AS.net_ndxConnect;
00033 }

void net_disconnect  
 

:

Definition at line 184 of file ANetwork.cpp.

00185 {
00187         AS.net_ndxConnect.CloseGame();
00188         AS.net_ndxConnect.CloseConnection();    
00189 }

void net_finalizeGame  
 

Definition at line 118 of file ANetwork.cpp.

References net_broadcast(), and net_send().

Referenced by updateMultiplayMenu().

00119 {
00120         NDX_Connect &net = AS.net_ndxConnect;
00121         for( int i=0; i<net.NumPlayers; i++ )
00122         {
00123                 ostringstream strm;
00124                 strm << "Assign <begin_name>" << net.Players[i].Name << "<end_name> " << i;
00125                 net_send( strm.str() );
00126 
00127                 if( AS.net_myName == net.Players[i].Name )  AS.net_myPlayerNum = i;                     // server's own number
00128         }
00129 
00130         // broadcast server DPID
00131         ostringstream strm;
00132         strm << "ServerDPID " << AS.net_ndxConnect.LocalDPID;
00133         net_broadcast( strm.str() );
00134 }

vector<string> net_getAllPlayers  
 

Definition at line 141 of file ANetwork.cpp.

Referenced by NetworkData::hasDataForGameTickArrived(), Overhead::overhead_init(), Overhead::playerExists(), Overhead::printPlayerList(), Overhead::processCommand(), and renderMultiplayMenu().

00142 {
00143         vector<string> result;
00144         
00145         if(AS.net_isFakeServer)
00146         {
00147                 result.push_back(AS.net_myName);
00148                 return result;
00149         }
00150 
00151         NDX_Connect &net = AS.net_ndxConnect;
00152         if(!AS.net_gameFinalized)  net.ScanForPlayers();
00153         
00154         for( int i=0; i<net.NumPlayers; i++ )
00155                 result.push_back( net.Players[i].Name );
00156 
00157         return result;
00158 }

string net_getPlayerName  
 

Definition at line 174 of file ANetwork.cpp.

Referenced by Overhead::overhead_update(), and NetworkSubsystem::processNetworkData().

00175 {
00176         return AS.net_myName;
00177 }

string net_getPlayerNameUsingNum int    num
 

Definition at line 288 of file ANetwork.cpp.

Referenced by Helper::playerColorToPlayerName(), and Overhead::printPlayerList().

00289 {
00290         map<int,string>::iterator iter = AS.net_mapNumToName.find(num);
00291         if( iter==AS.net_mapNumToName.end() ) return "NoNamePlayer";
00292         return (iter)->second;
00293 }

int net_getPlayerNumber  
 

Definition at line 179 of file ANetwork.cpp.

Referenced by Overhead::overhead_init().

00180 {
00181         return AS.net_myPlayerNum;
00182 }

int net_getPlayerNumUsingName string    playerName
 

Definition at line 281 of file ANetwork.cpp.

Referenced by Overhead::overhead_init(), and Overhead::printPlayerList().

00282 {
00283         map<string,int>::iterator iter = AS.net_mapNameToNum.find(playerName);
00284         if( iter==AS.net_mapNameToNum.end() ) return 0;
00285         return (iter)->second;
00286 }

string net_getSelfIP  
 

Definition at line 295 of file ANetwork.cpp.

Referenced by updateMultiplayMenu().

00296 {
00297         static bool init = false;
00298         if(!init)
00299         {
00300                 init = true;
00301                 WSAData wsa;
00302                 WSAStartup( MAKEWORD(1,1), &wsa );
00303         }
00304 
00305         char hostName[500];     
00306         int rc = gethostname(&hostName[0],499); 
00307         if(rc!=0) rc = WSAGetLastError();
00308         assert(rc != WSAEFAULT);
00309         assert(rc != WSANOTINITIALISED  );
00310         assert(rc != WSAENETDOWN );
00311         assert(rc != WSAEINPROGRESS );  
00312 
00313         struct hostent *phost = gethostbyname(hostName);
00314         char oip[50];
00315         for (int i = 0; phost->h_addr_list[i] != 0; ++i)
00316         {
00317                 struct in_addr addr;
00318                 memcpy(&addr, phost->h_addr_list[i], sizeof(struct in_addr));           
00319                 strcpy(oip,inet_ntoa(addr));            
00320                 break;
00321         }
00322 
00323         return string(oip);
00324 }

string net_recv  
 

Definition at line 191 of file ANetwork.cpp.

References net_broadcast(), net_recv(), and sys_console().

Referenced by net_recv(), processIncomingMessages(), and NetworkSubsystem::receiveNetworkData().

00192 {
00193         if(!AS.net_isInit) return "";
00194         NDX_Connect &net = AS.net_ndxConnect;
00195 
00196         if(AS.net_isServer)             // server, check send queue first
00197         {
00198                 if( AS.net_serverSendQueue.size()>0 )
00199                 {
00200                         string s = *AS.net_serverSendQueue.begin();
00201                         AS.net_serverSendQueue.pop_front();
00202                         net_broadcast(s);
00203                         if( s.find("Assign <begin_name>")==0 )                          // player number assignment
00204                         {
00205 
00206                                 sys_console() << s << endl;
00207 
00208                                 s = s.substr(19);                                       // skip header
00209                                 int i = (int)s.find("<end_name>");      // delete footer
00210                                 string name = s.substr(0,i);
00211                                 
00212 
00213                                 string numStr = s.substr(i+10);         // skip footer
00214                                 istringstream numStrm(numStr.c_str());
00215                                 int num;
00216                                 numStrm >> num;
00217                                 
00218                                 if( name==AS.net_myName )   AS.net_myPlayerNum = num;                   // it's me!  Store my number
00219                                 AS.net_mapNameToNum[name] = num;
00220                                 AS.net_mapNumToName[num]  = name;
00221                                 
00222                                 return net_recv();                                      // grab another msg
00223                         }
00224                         return s;
00225                 }
00226                 else if(!AS.net_isFakeServer)                                                   // if nothing in queue, do actual recv
00227                 {
00228                         if(!net.Receive()) return "";
00229                         if(net.FromDPID==DPID_SYSMSG) return net_recv();        // it's a system msg, try again
00230                         string s((char*)net.RBuffer);                   
00231                         net_broadcast(s);
00232                         return s;
00233 
00234                 }
00235         }
00236         else                                    // clients, just send it to server
00237         {
00238                 if(!net.Receive()) return "";
00239                 if(net.FromDPID==DPID_SYSMSG) return net_recv();        // it's a system msg, try again
00240                 string s((char*)net.RBuffer);
00241                 if( s.find("Assign <begin_name>")==0 )                          // player number assignment
00242                 {
00243 
00244                         sys_console() << s << endl;
00245 
00246                         s = s.substr(19);                                       // skip header
00247                         int i = (int)s.find("<end_name>");      // delete footer
00248                         string name = s.substr(0,i);
00249                         
00250 
00251                         string numStr = s.substr(i+10);         // skip footer
00252                         istringstream numStrm(numStr.c_str());
00253                         int num;
00254                         numStrm >> num;
00255                         
00256                         if( name==AS.net_myName )
00257                         {
00258                                 AS.net_myPlayerNum = num;                       // it's me!  Store my number
00259                                 sys_console() << "My num is " << num << endl;
00260                         }
00261                         AS.net_mapNameToNum[name] = num;
00262                         AS.net_mapNumToName[num]  = name;
00263                         sys_console() << "mapping " << name << " to " << num << endl;
00264                         
00265                         return net_recv();                                      // grab another msg
00266                 }
00267                 else if (s.find("ServerDPID")==0 )
00268                 {
00269                         string tmp;
00270                         istringstream strm(s);
00271                         strm >> tmp >> AS.net_serverDPID;
00272                         return net_recv();
00273                 }
00274                 
00275                 return s;
00276         }
00277 
00278         return "";
00279 }

void net_runAsFakeServer string    myName,
int    maxNumPlayers
 

works like net_runAsServer, except no networking actually happens this is useful when you want to test the game solo

Definition at line 54 of file ANetwork.cpp.

Referenced by updateMainMenu().

00055 {
00056         AS.net_isServer = true;
00057         AS.net_myName = myName;
00058         AS.net_serverSendQueue.resize(0);
00059         AS.net_gameFinalized = false;
00060         AS.net_myPlayerNum = -1;
00061         AS.net_isInit = true;
00062         AS.net_isFakeServer = true;
00063 }

void net_runAsServer string    myIP,
string    myName,
int    maxNumPlayers
 

Definition at line 35 of file ANetwork.cpp.

Referenced by updateMultiplayMenu().

00036 {
00037         NDX_Connect &net = AS.net_ndxConnect;
00038         if(!net.Create(&netGuid)) throw Error("Can't create DirectPlay");
00039 
00040         net.SetGuarenteed(true);
00041         if(!net.ConnectTCPIP( (char*)myIP.c_str() ))  throw Error("Can't connect to Server : " + myIP );
00042         if(!net.CreateGame("Aierra Engine Game", (char*)myName.c_str(), maxNumPlayers ))
00043                 throw Error("Can't Create Game");
00044 
00045         AS.net_isServer = true;
00046         AS.net_myName = myName;
00047         AS.net_serverSendQueue.resize(0);
00048         AS.net_gameFinalized = false;
00049         AS.net_myPlayerNum = -1;
00050         AS.net_isInit = true;
00051         AS.net_isFakeServer = false;
00052 }

void net_send string    msg
 

Definition at line 160 of file ANetwork.cpp.

Referenced by Overhead::askForRandomNumbers(), BattleEntry::inputIssueGroupCommand(), BattleEntry::inputIssueJetsCommand(), net_finalizeGame(), Overhead::overhead_update(), Overhead::processCommand(), HUD::processMiniMapInput(), NetworkSubsystem::processNetworkData(), Overhead::processOverheadInput(), NetworkMessages::sendBuildMessage(), sendGameTickEnd(), Overhead::sendMessageToPrintARandomNumberToTheConsole(), sendReinforcement(), and updateMultiplayMenu().

00161 {
00162         if(!AS.net_isInit) return;
00163         msg += "\0";
00164         if(AS.net_isServer)             // server, add to send queue
00165         {
00166                 AS.net_serverSendQueue.push_back(msg);
00167         }
00168         else                                    // clients, just send it to server
00169         {
00170                 AS.net_ndxConnect.Send( AS.net_serverDPID, &msg[0], (DWORD)msg.length()+1 );
00171         }
00172 }


Variable Documentation

GUID netGuid = { 0x809af2bd, 0x7881, 0x468b, { 0xa5, 0x3c, 0x48, 0xd5, 0x48, 0x69, 0x0, 0xd9 } }
 

Definition at line 27 of file ANetwork.cpp.


Generated on Wed Apr 23 05:50:30 2003 for Modern Warfare by doxygen1.3-rc2