23 #if !defined (_WIN32) || defined (__CYGWIN__)
92 using namespace VSFileSystem;
99 extern bool isWeapon( std::string name );
120 this->acctserver = 0;
121 this->srvtimeout.tv_sec = 0;
122 this->srvtimeout.tv_usec = 0;
123 this->snapchanged = 0;
133 _sock_set.addDownloadManager( _downloadManagerServer );
152 void NetServer::startMsg()
155 cout<<
"Written by Stephane Vaxelaire"<<endl<<endl<<endl;
169 const char *serverport = NULL;
171 for (i = 0; i < argc; ++i) {
174 if (strncmp( argv[i],
"-p", 2 ) == 0)
175 serverport = argv[i]+2;
179 for (j = i+1; j < argc; ++j)
185 string strperiod, strtimeout, strlogintimeout, strnetatom;
189 double reconnect_time = 0;
192 double planettime = 0;
207 cout<<
"Loading server config...";
216 cout<<
" config loaded"<<endl;
221 periodrecon = atoi( strperiodrecon.c_str() );
243 if ( configport.empty() )
245 if (serverport == NULL)
246 serverport = configport.c_str();
253 COUT<<
"Initializing TCP server ..."<<endl;
255 if (tcpNetwork == NULL) {
256 COUT<<
"Couldn't create TCP server - quitting"<<endl;
259 COUT<<
"Initializing UDP server ..."<<endl;
261 if (*udpNetwork == NULL) {
262 COUT<<
"Couldn't create UDP server - quitting"<<endl;
267 if ( acctsrv.empty() )
278 cout<<
"Not connecting to account server."<<endl;
280 cout<<
"Initializing connection to account server..."<<endl;
281 if ( acctsrv.empty() ) {
282 cout<<
"Account server IP not specified, exiting"<<endl;
285 if (acctsrv.find(
'/' ) == std::string::npos) {
293 if (acct_sock == NULL)
294 cerr<<
"Invalid Accountserver URL... "<<endl;
297 COUT<<
"accountserver on socket "<<acct_sock<<
" done."<<endl;
304 cout<<
"Universe LOADED"<<endl;
312 string dynpath =
"dynaverse.dat";
316 cerr<<
"!!! ERROR : opening dynamic universe file "<<dynpath.c_str()<<
" !!!"<<endl;
319 char *dynchar = strdup( dynaverse.c_str() );
320 globalsave->ReadSavedPackets( dynchar,
true );
327 gethostname( hostName, 128 );
328 hostent *local = NULL;
329 cout<<endl<<endl<<
" ======== SERVER IS NOW RUNNING ========"<<endl;
330 const AddressIP &adr = this->tcpNetwork->get_adr();
331 cout<<
" Server Port: "<<ntohs( adr.sin_port )<<endl;
332 cout<<
" Server IP Addresses: "<<endl;
337 local = gethostbyname( hostName );
339 in_addr **localaddr = (in_addr**) local->h_addr_list;
340 for (
int i = 0; i < 5 && localaddr[i]; i++) {
341 string ipaddr = inet_ntoa( *(localaddr[i]) );
342 if (ipaddr.substr( 0, 4 ) ==
"127.") {
348 if (ipaddr.substr( 0, 8 ) ==
"169.254.")
349 cout<<
" (Ethernet connection)";
350 else if (ipaddr.substr( 0, 8 ) ==
"192.168."
351 || ipaddr.substr( 0, 3 ) ==
"10.")
352 cout<<
" (Local Area Network)";
354 cout<<
" (Internet Connection)";
360 cout<<
" No network interfaces found associated to your hostname."<<endl;
362 cout<<
" (Consult Start-> Run-> 'cmd /k ipconfig' for your IP.)"<<endl;
364 cout<<
" (Consult the '/sbin/ifconfig' command-line tool for your IP.)"<<endl;
367 cout<<
" You can also connect locally using 'localhost'"<<endl;
369 cout<<
" Public Server: "<<endl<<
" ";
370 if (acctsrv.length() > 75)
371 cout<<acctsrv.substr( 0, 50 )<<
"..."<<acctsrv.substr( acctsrv.length()-20, 20 )<<endl;
375 if ( this->server_password.empty() )
376 cout<<
" Private Server"<<endl;
378 cout<<
" Private Server, Password Protected: <"<<this->server_password<<
">"<<endl;
380 cout<<
" --------------------------------------- "<<endl;
381 cout<<
"To stop this server, hit Ctrl-C, Ctrl-\\, Ctrl-Break, or close this window."<<endl;
382 cout<<endl<<
"Have fun!"<<endl<<endl;
396 checkMsg( _sock_set );
399 checkAcctMsg( _sock_set );
403 if (acctserver && !
acct_con && (curtime-reconnect_time) > periodrecon) {
405 reconnect_time = curtime+periodrecon;
411 if ( acct_sock->valid() ) {
414 COUT<<
">>> Reconnected accountserver on socket "<<*acct_sock<<
" done."<<endl;
420 for (j = 0, i = allClients.begin(); i != allClients.end(); i++, j++)
425 if ( !acct_sock->sendstr( netbuf ) )
426 COUT<<
"Failure to resync, SOCKET was : "<<*acct_sock<<endl;
428 cerr<<
">>> Reconnection to account server failed."<<endl;
432 this->checkTimedoutClients_udp();
436 for (j = discList.begin(); j != discList.end(); j++)
440 for (j = logoutList.begin(); j != logoutList.end(); j++)
441 this->logout( (*j) );
465 zonemgr->broadcastSnapshots(
true );
466 planettime = curtime;
470 zonemgr->broadcastSnapshots(
false );
480 cout<<
">>> Saving server status... Time="<<curtime<<endl;
483 cout<<
"<<< Finished saving."<<endl;
485 _sock_set.waste_time( 0, 10000 );
490 this->closeAllSockets();
499 void NetServer::checkKey(
SocketSet &sets )
504 if ( sets.select( 0, 0 ) ) {
505 if (read( 0, &c, 1 ) == -1)
506 cerr<<
"Error reading char on std input "<<endl;
516 cout<<
"-----------------------------------------------"<<endl;
517 cout<<
"| Server stats |"<<endl;
518 cout<<
"-----------------------------------------------"<<endl<<endl;
520 cout<<
"\tNumber of players in all star systems :\t\t"<<allClients.size()<<endl;
521 cout<<
"\t\tClients : "<<allClients.size()<<endl;
522 cout<<
"\tNumber of clients waiting for authorization :\t"<<waitList.size()<<endl<<endl;
523 zonemgr->displayStats();
524 cout<<
"-----------------------------------------------"<<endl;
525 cout<<
"| End stats |"<<endl;
526 cout<<
"-----------------------------------------------"<<endl<<endl;
531 cout<<
"-----------------------------------------------"<<endl;
532 cout<<
"| Server memory usage |"<<endl;
533 cout<<
"-----------------------------------------------"<<endl<<endl;
535 memory_use +=
sizeof (
int)*5+
sizeof (
SOCKETALT)+
sizeof (
struct timeval);
537 memory_use +=
sizeof (
Client*)*allClients.size()+discList.size()*
sizeof (
Client*)+waitList.size()
538 *
sizeof (
struct WaitListEntry);
539 cout<<
"\tSize of NetServer variables :\t"<<(memory_use/1024)<<
" KB ("<<memory_use<<
" bytes)"<<endl;
540 memory_use += zonemgr->displayMemory();
541 cout<<
"\t========== TOTAL MEMORY USAGE = "
542 <<(memory_use/1024)<<
" KB ("<<memory_use<<
" bytes) ==========="<<endl<<endl;
559 void NetServer::checkMsg(
SocketSet &sets )
563 bool printit =
false;
564 ostr<<
"Checking activity on sockets, TCP=";
565 for (
LI i = allClients.begin();
i != allClients.end();
i++) {
567 if ( cl->sock.isActive() ) {
568 ostr<<cl->sock.get_fd()<<
"+ ";
570 this->recvMsg_tcp( cl );
574 if ( udpNetwork->isActive() ) {
575 ostr<<
"UDP="<<udpNetwork->get_fd()<<
"+"<<ends;
579 if ( tcpNetwork->isActive() )
582 if (printit)
COUT<<ostr.str()<<endl;
586 for (
LI i = allClients.begin();
i != allClients.end();
i++) {
588 if ( cl->tcp_sock.isActive() )
589 this->recvMsg_tcp( cl );
591 if ( udpNetwork->isActive() )
593 if ( tcpNetwork->isActive() )
612 if ( int_ts < clt->getLatestTimestamp() ) {
656 NetBuffer netbuf( packet.getData(), packet.getDataLength() );
658 clt->versionBuf( netbuf );
659 unsigned int mount_num;
672 clt->netversion = packet_serial;
678 netnewbuf.
addString( clt->cltadr.ipadr() );
685 COUT<<
">>> LOGIN REQUEST --------------------------------------"<<endl;
690 this->localLogin( clt, packet );
692 this->sendLoginUnavailable( clt );
697 NetBuffer netbuf( packet.getData(), packet.getDataLength() );
699 std::string passwd = netbuf.getString();
702 entry.type = WaitListEntry::CONNECTING;
704 if ( user.empty() ) {
705 sendLoginError( clt );
710 if ( waitList.find( user ) != waitList.end() ) {
711 sendLoginAlready( clt );
714 iptmp = &clt->cltadr;
715 tmpsock = clt->tcp_sock;
718 COUT<<
"Redirecting login request to account server on socket "<<*acct_sock<<endl
719 <<
"*** Packet to copy length : "<<packet.getDataLength()<<endl;
721 std::string redirect( redirectcommand );
725 COUT<<
"Cannot login player "<<user<<
": already exists on this server!";
726 sendLoginAlready( clt );
730 if ( !user.empty() ) {
733 if ( !acct_sock->sendstr( redirect ) ) {
735 perror(
"FATAL ERROR sending redirected login request to ACCOUNT SERVER : " );
736 COUT<<
"SOCKET was : "<<acct_sock<<endl;
737 this->sendLoginUnavailable( clt );
740 this->waitList[user] = (entry);
748 COUT<<
"<<< LOGIN REQUEST --------------------------------------"<<endl;
752 this->chooseShip( clt, packet );
755 this->sendLoginError( clt );
761 COUT<<
">>> ADD REQUEST =( serial #"<<packet.getSerial()<<
" )= --------------------------------------"<<endl;
763 this->addClient( clt );
764 COUT<<
"<<< ADD REQUEST --------------------------------------------------------------"<<endl;
769 this->posUpdate( clt );
778 serverTimeInitUDP( clt, netbuf );
784 un = clt->game_unit.GetUnit();
785 string message = netbuf.getString();
787 if ( message.empty() )
break;
788 if (message[0] ==
'/') {
790 bool local = (clt->cltadr.inaddr() == 0x0100007f);
802 std::replace( message.begin(), message.end(),
'\n',
' ' );
803 std::replace( message.begin(), message.end(),
'\r',
' ' );
804 string::size_type first_space = message.find(
' ' );
805 if (first_space == string::npos) {
806 cmd = message.substr( 1 );
808 cmd = message.substr( 1, first_space-1 );
809 args = message.substr( first_space+1 );
815 message = message.substr( 0, 160 );
816 std::replace( message.begin(), message.end(),
'#',
'$' );
817 std::replace( message.begin(), message.end(),
'\n',
' ' );
818 std::replace( message.begin(), message.end(),
'\r',
' ' );
819 netbuf.addString( clt->callsign );
820 netbuf.addString( message );
826 COUT<<
"Received text message from client "<<clt->callsign<<endl;
831 COUT<<
">>> LOGOUT REQUEST =( serial #"<<packet.getSerial()<<
" )= --------------------------------------"<<endl;
833 logoutList.push_back( clt );
834 COUT<<
"<<< LOGOUT REQUEST -----------------------------------------------------------------"<<endl;
840 un = clt->game_unit.GetUnit();
843 bool trusted = (clt->cltadr.inaddr() == 0x0100007f);
853 string cmd = netbuf.getString();
854 string args = netbuf.getString();
855 string id = netbuf.getString();
863 COUT<<
"Received a save request for "
864 <<clt->callsign<<
" ("<<packet_serial<<
")..."<<endl;
865 un = clt->game_unit.GetUnit();
869 saveAccount( cpnum );
873 un = clt->game_unit.GetUnit();
880 COUT<<
"Received a respawning request for "
881 <<clt->callsign<<
"..."<<endl;
884 Unit *oldun = clt->game_unit.GetUnit();
885 if (oldun == NULL || oldun->
GetHull() <= 0) {
886 zonemgr->removeClient( clt );
887 if (oldun) oldun->
Kill(
true,
true );
888 Cockpit *cp = loadCockpit( clt );
889 loadFromSavegame( clt, cp );
891 this->addClient( clt );
893 COUT<<clt->callsign<<
"'s not quite dead yet laddie. Disallowing respawn\n";
899 std::string cargoName = netbuf.getString();
900 int type = netbuf.getChar();
903 Unit *player = clt->game_unit.GetUnit();
906 if (cpnum == -1)
break;
912 docked =
const_cast< Unit*
> (un);
918 unsigned int cargIndex = UINT_MAX;
920 if (cargIndex == UINT_MAX || !cargptr)
break;
927 saveAccount( cpnum );
934 COUT<<
">>> CMD DOWNLOAD =( serial #"<<packet.getSerial()<<
" )= --------------------------------------"<<endl;
935 if (_downloadManagerServer)
936 _downloadManagerServer->addCmdDownload( clt->tcp_sock, netbuf );
937 COUT<<
"<<< CMD DOWNLOAD --------------------------------------------------------------"<<endl;
942 target_serial = netbuf.getSerial();
943 un = clt->game_unit.GetUnit();
945 COUT<<
"ERROR --> Received a fire order for dead UNIT"<<endl;
949 mis = netbuf.getChar();
950 mount_num = (
unsigned int)netbuf.getInt32();
953 un = zonemgr->getUnit( target_serial, zone );
955 COUT<<
"ERROR --> Received a fire order for non-existing UNIT"<<endl;
957 if ( mount_num > un->
mounts.size() ) {
958 COUT<<
"ERROR recvd information about "<<mount_num<<
" mounts, only "<<un->
mounts.size()<<
" on ship"<<std::endl;
959 mount_num = un->
mounts.size();
964 ::iterator
i = un->
mounts.begin();
965 for (; i != un->
mounts.end(); ++i) {
966 printf(
"%.1f, ", (*i).time_to_lock );
969 for (
unsigned int j = 0;
j < mount_num; ++
j) {
970 unsigned int mnt = (
unsigned int)netbuf.getInt32();
971 if (mnt < un->mounts.size() && mnt >= 0)
974 COUT<<
"ERROR --> Received a fire order on an invalid MOUNT: "<<mount_num<<
" > "<<( un->
mounts.size() )
986 target_serial = netbuf.getSerial();
987 mount_num = (
unsigned int)netbuf.getInt32();
988 un = clt->game_unit.GetUnit();
990 COUT<<
"ERROR --> Received an unfire order for dead UNIT"<<endl;
996 un = zonemgr->getUnit( target_serial, zone );
998 COUT<<
"ERROR --> Received an unfire order for non-existing UNIT"<<endl;
1001 ::iterator i = un->
mounts.begin();
1002 if ( mount_num > un->
mounts.size() ) {
1003 COUT<<
"ERROR recvd information about "<<mount_num<<
" mounts, only "<<un->
mounts.size()<<
" on ship"<<std::endl;
1004 mount_num = un->
mounts.size();
1006 for (; i != un->
mounts.end(); ++i)
1008 for (
unsigned int j = 0;
j < mount_num;
j++) {
1009 unsigned int mnt = (
unsigned int)netbuf.getInt32();
1010 if (mnt < un->mounts.size() && mnt >= 0)
1013 COUT<<
"ERROR --> Received an unfire order on an invalid MOUNT: "<<mount_num<<
" > "<<( un->
mounts.size() )
1023 un = clt->game_unit.GetUnit();
1030 string newsystem = netbuf.getString();
1032 unsigned char *server_hash =
new unsigned char[FileUtil::Hash.DigestSize()];
1033 unsigned char *client_hash = netbuf.getBuffer( FileUtil::Hash.DigestSize() );
1035 cerr<<
"ATTEMPTING TO JUMP, BUT JUMP UNIMPLEMENTED"<<endl;
1039 un = clt->game_unit.GetUnit();
1041 COUT<<
"ERROR --> Received a jump request from non-existing UNIT"<<endl;
1046 for (
unsigned int i = 0; !found && i < adjacent.size(); i++)
1047 if (adjacent[i] == newsystem)
1059 delete[] server_hash;
1065 Unit *sender = clt->game_unit.GetUnit();
1068 if (playernum < 0)
break;
1069 unsigned short type = netbuf.getShort();
1070 string qualname = netbuf.getString();
1071 int pos = netbuf.getInt32();
1083 if (temp < stringCount) stringCount = temp;
1085 if (temp < stringCount) stringCount = temp;
1086 for (
unsigned int i = 0; i < stringCount; i++) {
1095 if ( finalScript.empty() )
break;
1099 string nission = string(
"#" )+qualname;
1100 LoadMission( nission.c_str(), finalScript, false );
1112 char newEdge = netbuf.getChar();
1113 int node = netbuf.getInt32();
1114 Unit *parent = clt->game_unit.GetUnit();
1122 if ( node < 0 || (
unsigned int) node >= fsm->
nodes.size() )
1127 if ( oldNode < 0 || (
unsigned int) node >= fsm->
nodes.size() )
1129 if ( (
unsigned int) newEdge >= fsm->
nodes[oldNode].edges.size() )
1131 newNode = fsm->
nodes[oldNode].edges[newEdge];
1133 unsigned char sex = 0;
1144 ObjSerial buyer_ser = netbuf.getSerial();
1145 ObjSerial seller_ser = netbuf.getSerial();
1146 int quantity = netbuf.getInt32();
1147 std::string cargoName = netbuf.getString();
1148 int mountOffset = ( (
int) netbuf.getInt32() );
1149 int subunitOffset = ( (
int) netbuf.getInt32() );
1150 Unit *sender = clt->game_unit.GetUnit();
1152 if (!sender || !sender->
getStarSystem() || !sender_cpt)
break;
1154 unsigned int cargIndex = UINT_MAX;
1155 Unit *seller = zonemgr->getUnit( seller_ser, zone );
1156 Unit *buyer = zonemgr->getUnit( buyer_ser, zone );
1157 Unit *docked = NULL;
1162 docked =
const_cast< Unit*
> (un);
1168 if (seller == sender) {
1175 if (seller == sender)
1183 bool sellerEmpty =
false;
1184 Cargo *cargptr = NULL;
1186 cargptr = seller->
GetCargo( cargoName, cargIndex );
1188 cargIndex = UINT_MAX;
1192 fprintf( stderr,
"Player id %d attempted transaction with NULL cargo %s, %d->%d\n",
1193 sender ? sender->
GetSerial() : -1, cargoName.c_str(),
1200 Cargo carg = *cargptr;
1202 bool weapon =
false;
1203 bool didMoney =
false;
1204 bool didUpgrade =
false;
1210 else if (!quantity && buyer == sender)
1213 if (weapon && quantity) {
1218 if (!weapon && sellerEmpty) {
1223 if (!weapon && !quantity && !repair) {
1227 if (seller == NULL) {
1232 if (buyer == NULL) {
1233 if (cargIndex != UINT_MAX)
1237 if (quantity && cargIndex != UINT_MAX) {
1241 if (buyer == sender && buyer_cpt) {
1242 float creds_before = buyer_cpt->
credits;
1243 float &creds = buyer_cpt->
credits;
1244 if ( buyer->
BuyCargo( cargIndex, quantity, seller, creds ) ) {
1247 seller_cpt->
credits += (creds_before-creds);
1249 }
else if (seller == sender && seller_cpt) {
1250 float creds_before = seller_cpt->
credits;
1251 float &creds = seller_cpt->
credits;
1252 bool success =
false;
1254 success = seller->
SellCargo( cargIndex, quantity, creds, carg, buyer );
1256 success = seller->
RemoveCargo( cargIndex, quantity,
true );
1260 buyer_cpt->
credits += (creds_before-creds);
1264 if ( (didMoney || weapon) && upgrade && (seller == sender || buyer == sender) ) {
1277 string templateName;
1281 if (seller == sender) {
1282 templateName = unitDir+
".blank";
1284 }
else if (buyer == sender) {
1286 templateName = unitDir+
".template";
1294 templateUnit = NULL;
1300 if (seller == sender) {
1302 if ( seller->
canDowngrade( unitCarg, mountOffset, subunitOffset, percent, templateUnit ) ) {
1308 if (buyer && didMoney)
1313 seller->
Downgrade( unitCarg, mountOffset, subunitOffset, percent, templateUnit );
1318 }
else if (buyer == sender) {
1320 if ( buyer->
canUpgrade( unitCarg, mountOffset, subunitOffset, multAddMode,
true, percent,
1327 if (seller && didMoney && cargIndex != UINT_MAX)
1332 buyer->
Upgrade( unitCarg, mountOffset, subunitOffset, multAddMode,
true, percent, templateUnit );
1339 if (repair && !didMoney)
1348 BroadcastCargoUpgrade( sender->
GetSerial(), buyer_ser, seller->
GetSerial(), cargoName,
1350 quantity, 0, 0, zone );
1351 }
else if (didUpgrade) {
1352 BroadcastCargoUpgrade( sender->
GetSerial(), buyer_ser, seller->
GetSerial(), cargoName,
1354 weapon || repair ? 0 : 1, mountOffset, subunitOffset, zone );
1364 target_serial = netbuf.getSerial();
1365 unclt = clt->game_unit.GetUnit();
1371 COUT<<
"StarSystem for client "<<clt->callsign
1372 <<
", "<<unclt->
GetSerial()<<
" not found!"<<endl;
1379 un = zonemgr->getUnit( target_serial, zone );
1389 char engage = netbuf.getChar();
1390 unclt = clt->game_unit.GetUnit();
1393 unclt->
Cloak( engage );
1399 target_serial = netbuf.getSerial();
1400 unclt = clt->game_unit.GetUnit();
1402 un = zonemgr->getUnit( target_serial, zone );
1407 unclt = zonemgr->getUnit( packet.getSerial(), zone );
1426 un = clt->game_unit.GetUnit();
1428 float freq = netbuf.getFloat();
1429 clt->comm_freq = freq;
1430 clt->secured = netbuf.getChar();
1431 clt->webcam = netbuf.getChar();
1432 clt->portaudio = netbuf.getChar();
1434 p2.
bc_create( packet.getCommand(), packet_serial,
1435 packet.getData(), packet.getDataLength(),
SENDRELIABLE,
1442 un = clt->game_unit.GetUnit();
1444 clt->comm_freq = -1;
1447 p2.
bc_create( packet.getCommand(), packet_serial,
1448 packet.getData(), packet.getDataLength(),
SENDRELIABLE,
1454 un = clt->game_unit.GetUnit();
1457 p2.bc_create( packet.getCommand(), packet_serial,
1458 packet.getData(), packet.getDataLength(),
SENDRELIABLE,
1460 zonemgr->broadcastSample( un->
getStarSystem()->
GetZone(), packet_serial, &p2, clt->comm_freq );
1464 un = clt->game_unit.GetUnit();
1467 p2.bc_create( packet.getCommand(), packet_serial, ,
1475 un = clt->game_unit.GetUnit();
1477 ObjSerial utdwserial = netbuf.getSerial();
1479 cerr<<
"RECEIVED a DockRequest from unit "<<un->
GetSerial()<<
" to unit "<<utdwserial<<
" in zone "<<zonenum<<endl;
1480 docking_unit = zonemgr->getUnit( utdwserial, zonenum );
1483 int dockport = un->
Dock( docking_unit )-1;
1484 if (dockport >= 0) {
1485 this->sendDockAuthorize( un->
GetSerial(), utdwserial, dockport, zonenum );
1488 vector< string >vec;
1489 vec.push_back( docking_unit->
name );
1493 this->sendDockDeny( un->
GetSerial(), zonenum );
1496 cerr<<
"!!! ERROR : cannot dock with unit serial="<<utdwserial<<endl;
1503 un = clt->game_unit.GetUnit();
1505 ObjSerial utdwserial = netbuf.getSerial();
1507 cerr<<
"RECEIVED an UnDockRequest from unit "<<un->
GetSerial()<<
" to unit "<<utdwserial<<
" in zone "<<zonenum<<endl;
1508 docking_unit = zonemgr->getUnit( utdwserial, zonenum );
1510 bool undocked = un->
UnDock( docking_unit );
1513 if (un && cpt >= 0) {
1514 vector< string >vec;
1515 vec.push_back(
string() );
1518 this->sendUnDock( un->
GetSerial(), utdwserial, zonenum );
1521 cerr<<
"!!! ERROR : cannot dock with unit serial="<<utdwserial<<endl;
1526 un = clt->game_unit.GetUnit();
1527 COUT<<
"Unknown command "<<
Cmd( cmd )<<
" ! "<<
"from client ";
1532 COUT<<
" ("<<clt->callsign<<
")";
1549 zonemgr->broadcast( zone, 0, &p, isTcp );
1560 tcpNetwork->disconnect(
"Closing sockettcp" );
1561 udpNetwork->disconnect(
"Closing socketudp" );
1562 for (
LI i = allClients.begin(); i != allClients.end(); i++) {
1564 cl->tcp_sock.disconnect( cl->callsign.c_str() );
1570 zonemgr->addSystem( sysname, system );