From: <tu...@us...> - 2010-04-20 15:15:54
|
Revision: 244 http://polserver.svn.sourceforge.net/polserver/?rev=244&view=rev Author: turley Date: 2010-04-20 15:15:44 +0000 (Tue, 20 Apr 2010) Log Message: ----------- first crash fix for pkts Modified Paths: -------------- trunk/pol-core/pol/network/packets.cpp trunk/pol-core/pol/network/packets.h Modified: trunk/pol-core/pol/network/packets.cpp =================================================================== --- trunk/pol-core/pol/network/packets.cpp 2010-04-19 14:50:47 UTC (rev 243) +++ trunk/pol-core/pol/network/packets.cpp 2010-04-20 15:15:44 UTC (rev 244) @@ -160,16 +160,16 @@ PacketInterfaceQueueMap::iterator itr = packets.find(sub); if (itr != packets.end()) { - PacketInterface* pkt = itr->second.front(); // get next one - itr->second.pop(); // and remove it from queue - pkt->ReSetBuffer(); - return pkt; + if (!itr->second.empty()) + { + PacketInterface* pkt = itr->second.front(); // get next one + itr->second.pop(); // and remove it from queue + pkt->ReSetBuffer(); + return pkt; + } } - else - return GetPacket(id,sub); } - else - return GetPacket(id,sub); + return GetPacket(id,sub); //critical end } Modified: trunk/pol-core/pol/network/packets.h =================================================================== --- trunk/pol-core/pol/network/packets.h 2010-04-19 14:50:47 UTC (rev 243) +++ trunk/pol-core/pol/network/packets.h 2010-04-20 15:15:44 UTC (rev 244) @@ -245,7 +245,7 @@ (*(u16*)&buffer[_suboff]) = cfBEu16(_sub); offset=1; } - inline u16 getSubID() { return ctBEu16((*(u16*)&buffer[_suboff])); } + inline u16 getSubID() { return _sub; /*ctBEu16((*(u16*)&buffer[_suboff]));*/ } }; //special def for encrypted buffer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tu...@us...> - 2011-12-17 18:41:45
|
Revision: 428 http://polserver.svn.sourceforge.net/polserver/?rev=428&view=rev Author: turley Date: 2011-12-17 18:41:38 +0000 (Sat, 17 Dec 2011) Log Message: ----------- fixed locking on different threads for client, used the existing mutex too secure the whole transmit per client Modified Paths: -------------- trunk/pol-core/pol/network/client.cpp trunk/pol-core/pol/network/client.h trunk/pol-core/pol/network/clientio.cpp trunk/pol-core/pol/network/clienttransmit.cpp trunk/pol-core/pol/network/packethooks.cpp trunk/pol-core/pol/network/packethooks.h Modified: trunk/pol-core/pol/network/client.cpp =================================================================== --- trunk/pol-core/pol/network/client.cpp 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/client.cpp 2011-12-17 18:41:38 UTC (rev 428) @@ -448,7 +448,6 @@ const unsigned char *cdata = (const unsigned char *) data; int nsent; - LocalMutex guard(&_SocketMutex); if (-1 == (nsent = send( csocket, (const char *)cdata, datalen, 0 ))) { THREAD_CHECKPOINT( active_client, 204 ); @@ -495,13 +494,13 @@ void Client::send_queued_data() { + LocalMutex guard(&_SocketMutex); XmitBuffer *xbuffer; // hand off data to the sockets layer until it won't take any more. // note if a buffer is sent in full, we try to send the next one, ad infinitum while (NULL != (xbuffer = first_xmit_buffer)) { int nsent; - LocalMutex guard(&_SocketMutex); nsent = send( csocket, (char *) &xbuffer->data[xbuffer->nsent], xbuffer->lenleft, Modified: trunk/pol-core/pol/network/client.h =================================================================== --- trunk/pol-core/pol/network/client.h 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/client.h 2011-12-17 18:41:38 UTC (rev 428) @@ -124,7 +124,7 @@ bool isConnected() const; void closeConnection(); - void transmit( const void *data, int len ); // for entire message or header only + void transmit( const void *data, int len, bool needslock=false ); // for entire message or header only void transmitmore( const void *data, int len ); // for stuff after a header void recv_remaining( int total_expected ); Modified: trunk/pol-core/pol/network/clientio.cpp =================================================================== --- trunk/pol-core/pol/network/clientio.cpp 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/clientio.cpp 2011-12-17 18:41:38 UTC (rev 428) @@ -181,7 +181,7 @@ THREAD_CHECKPOINT( active_client, 116 ); } #include "../packetscrobj.h" -void Client::transmit( const void *data, int len ) +void Client::transmit( const void *data, int len, bool needslock) { ref_ptr<BPacket> p; bool handled = false; @@ -191,10 +191,8 @@ //pointer to the packet object. // //If there is no outgoing packet script, handled will be false, and the passed params will be unchanged. - { - PolLock lck; - CallOutgoingPacketExportedFunction(this, data, len, p, handled); - } + CallOutgoingPacketExportedFunction(this, data, len, p, handled, needslock); + if(handled) return; @@ -207,6 +205,8 @@ fprintf( fpLog, "\n" ); } + LocalMutex guard(&_SocketMutex); + if (last_xmit_buffer) { queuedmode_iostats.sent[ msgtype ].count++; Modified: trunk/pol-core/pol/network/clienttransmit.cpp =================================================================== --- trunk/pol-core/pol/network/clienttransmit.cpp 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/clienttransmit.cpp 2011-12-17 18:41:38 UTC (rev 428) @@ -71,7 +71,7 @@ if (data.disconnects) data.client->forceDisconnect(); else if (data.client->isReallyConnected()) - data.client->transmit(static_cast<void*>(&data.data[0]),data.len); + data.client->transmit(static_cast<void*>(&data.data[0]),data.len,true); } } wait_for_ClientTransmit_pulse(1000); Modified: trunk/pol-core/pol/network/packethooks.cpp =================================================================== --- trunk/pol-core/pol/network/packethooks.cpp 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/packethooks.cpp 2011-12-17 18:41:38 UTC (rev 428) @@ -40,6 +40,7 @@ #include "packethooks.h" #include "../packetscrobj.h" #include "../uoscrobj.h" +#include "../polsem.h" //stores information about each packet and its script & default handler std::vector<PacketHookData> packet_hook_data(256); @@ -162,7 +163,7 @@ } } -void CallOutgoingPacketExportedFunction(Client* client, const void*& data, int& inlength, ref_ptr<BPacket>& outpacket, bool& handled) +void CallOutgoingPacketExportedFunction(Client* client, const void*& data, int& inlength, ref_ptr<BPacket>& outpacket, bool& handled, bool needslock) { //find the script handler data bool subcmd_handler_exists = false; @@ -212,6 +213,8 @@ else calling_ref = client->make_ref(); + if (needslock) + polsem_lock(); if( phd->outgoing_function->call(calling_ref , outpacket.get()) == 0 ) { data = static_cast<void*>(&outpacket->buffer[0]); @@ -221,6 +224,8 @@ } else handled = true; + if (needslock) + polsem_unlock(); } else //packet is variable length { @@ -235,6 +240,8 @@ else calling_ref = client->make_ref(); + if (needslock) + polsem_lock(); if( phd->outgoing_function->call(calling_ref ,outpacket.get()) == 0 ) { //the buffer size may have changed in the script, make sure the packet gets the right size @@ -249,6 +256,8 @@ } else handled = true; + if (needslock) + polsem_unlock(); } } Modified: trunk/pol-core/pol/network/packethooks.h =================================================================== --- trunk/pol-core/pol/network/packethooks.h 2011-12-17 15:52:02 UTC (rev 427) +++ trunk/pol-core/pol/network/packethooks.h 2011-12-17 18:41:38 UTC (rev 428) @@ -51,7 +51,7 @@ extern std::vector<PacketHookData> packet_hook_data_v2; void load_packet_hooks(); void ExportedPacketHookHandler(Client* client, void* data); -void CallOutgoingPacketExportedFunction(Client* client, const void*& data, int& inlength, ref_ptr<BPacket>& outpacket, bool& handled); +void CallOutgoingPacketExportedFunction(Client* client, const void*& data, int& inlength, ref_ptr<BPacket>& outpacket, bool& handled, bool needslock=false); void clean_packethooks(); void SetVersionDetailStruct( const std::string& ver, VersionDetailStruct& detail ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tu...@us...> - 2014-08-02 17:56:00
|
Revision: 831 http://sourceforge.net/p/polserver/code/831 Author: turley Date: 2014-08-02 17:55:53 +0000 (Sat, 02 Aug 2014) Log Message: ----------- missing files for packets. added 0x25 usage Added Paths: ----------- trunk/pol-core/pol/network/packetdefs.cpp trunk/pol-core/pol/network/packetdefs.h Added: trunk/pol-core/pol/network/packetdefs.cpp =================================================================== --- trunk/pol-core/pol/network/packetdefs.cpp (rev 0) +++ trunk/pol-core/pol/network/packetdefs.cpp 2014-08-02 17:55:53 UTC (rev 831) @@ -0,0 +1,227 @@ + +#include "../../clib/logfacility.h" + +#include "packetdefs.h" + +namespace Pol { + namespace Network { + + void SendWorldItem::Send( Client* client ) + { + if ( client->ClientType & CLIENTTYPE_7000 ) + { + if ( _p->offset==1) + buildF3(); + if ( client->ClientType & CLIENTTYPE_7090 ) /*once known split class?*/ + _p.Send( client, 26 ); + else + _p.Send( client, 24 ); + } + else + { + if ( _p_old->offset == 1 ) + build1A(); + _p_old.Send( client, _p_oldlen ); + } + } + + void SendWorldItem::updateFlags( u8 flags ) + { + if ( flags != _flags ) + { + _flags = flags; + if ( _p_old->offset != 1 ) + { + _p_old->offset = _p_oldlen - 1; + _p_old->Write<u8>( _flags ); + } + if ( _p->offset != 1 ) + { + _p->offset = 23; + _p->Write<u8>( _flags ); + } + } + } + + void SendWorldItem::build1A() + { + _p_old->offset = 1; + // transmit item info + _p_old->offset += 2; + // If the 0x80000000 is left out, the item won't show up. + _p_old->WriteFlipped<u32>( static_cast<u32>( 0x80000000 | _serial ) ); // bit 0x80000000 enables piles + _p_old->WriteFlipped<u16>( _graphic ); + _p_old->WriteFlipped<u16>( _amount ); + if ( _facing == 0 ) + { + _p_old->WriteFlipped<u16>( _x ); + // bits 0x80 and 0x40 are Dye and Move (dunno which is which) + _p_old->WriteFlipped<u16>( static_cast<u16>( 0xC000 | _y ) ); // dyeable and moveable? + } + else + { + _p_old->WriteFlipped<u16>( static_cast<u16>( 0x8000 | _x ) ); + // bits 0x80 and 0x40 are Dye and Move (dunno which is which) + _p_old->WriteFlipped<u16>( static_cast<u16>( 0xC000 | _y ) ); // dyeable and moveable? + _p_old->Write<u8>( _facing ); + } + _p_old->Write<s8>( _z ); + _p_old->WriteFlipped<u16>( _color ); + _p_old->Write<u8>( _flags ); + _p_oldlen = _p_old->offset; + _p_old->offset = 1; + _p_old->WriteFlipped<u16>( _p_oldlen ); + } + void SendWorldItem::buildF3( ) + { + _p->offset = 1; + _p->WriteFlipped<u16>( 0x1 ); + _p->offset++; // datatype + _p->WriteFlipped<u32>( _serial ); + _p->WriteFlipped<u16>( _graphic ); + _p->Write<u8>( 0 ); + _p->WriteFlipped<u16>( _amount ); + _p->WriteFlipped<u16>( _amount ); + _p->WriteFlipped<u16>( _x ); + _p->WriteFlipped<u16>( _y ); + _p->Write<s8>( _z ); + _p->Write<u8>( _facing ); + _p->WriteFlipped<u16>( _color ); + _p->Write<u8>( _flags ); + } + + SendWorldItem::SendWorldItem( u32 serial, u16 graphic, u16 amount, u16 x, u16 y, s8 z, u8 facing, u16 color, u8 flags ) + : PktSender(), + _p_oldlen( 0 ), + _serial(serial), + _graphic(graphic), + _amount(amount), + _x(x), + _y(y), + _z(z), + _facing(facing), + _color(color), + _flags(flags) + { + } + + SendWorldMulti::SendWorldMulti( u32 serial_ext, u16 graphic, u16 x, u16 y, s8 z, u16 color ) + : PktSender(), + _p_oldlen( 0 ), + _serial_ext( serial_ext ), + _graphic( graphic ), + _x( x ), + _y( y ), + _z( z ), + _color( color ) + { + + } + + void SendWorldMulti::build1A( ) + { + _p_old->offset = 1; + _p_old->offset += 2; + _p_old->Write<u32>( _serial_ext ); + _p_old->WriteFlipped<u16>( _graphic | 0x4000 ); + _p_old->WriteFlipped<u16>( _x ); + _p_old->WriteFlipped<u16>( _y ); + _p_old->Write<s8>( _z ); + _p_oldlen = _p_old->offset; + _p_old->offset = 1; + _p_old->WriteFlipped<u16>( _p_oldlen ); + } + + void SendWorldMulti::buildF3( ) + { + _p->offset = 1; + _p->WriteFlipped<u16>( 0x1 ); + _p->Write<u8>( static_cast<u8>( 0x02 ) ); + _p->Write<u32>( _serial_ext ); + _p->WriteFlipped<u16>( _graphic ); + _p->Write<u8>( 0 ); + _p->WriteFlipped<u16>( static_cast<u16>( 0x1 ) ); //amount + _p->WriteFlipped<u16>( static_cast<u16>( 0x1 ) ); //amount + _p->WriteFlipped<u16>( _x ); + _p->WriteFlipped<u16>( _y ); + _p->Write<s8>( _z ); + _p->Write<u8>( 0 ); // facing + _p->WriteFlipped<u16>( _color ); + _p->Write<u8>( 0 ); // flags + } + + void SendWorldMulti::Send( Client* client ) + { + if ( client->ClientType & CLIENTTYPE_7000 ) + { + if ( _p->offset == 1 ) + buildF3(); + if ( client->ClientType & CLIENTTYPE_7090 ) /*once known split class?*/ + _p.Send( client, 26 ); + else + _p.Send( client, 24 ); + } + else + { + if ( _p_old->offset == 1 ) + build1A(); + _p_old.Send( client, _p_oldlen ); + } + } + + + AddItemContainerMsg::AddItemContainerMsg( u32 serial_ext, u16 graphic, u16 amount, u16 x, u16 y, u8 slotindex, u32 containerserial_ext, u16 color ) + : PktSender(), + _serial_ext( serial_ext ), + _graphic( graphic ), + _amount( amount ), + _x( x ), + _y( y ), + _slotindex( slotindex ), + _containerserial_ext( containerserial_ext ), + _color( color ) + {} + + void AddItemContainerMsg::buildLegacy() + { + _p_old->offset = 1; + _p_old->Write<u32>( _serial_ext ); + _p_old->WriteFlipped<u16>( _graphic ); + _p_old->offset++; //unk7 layer? + _p_old->WriteFlipped<u16>( _amount ); + _p_old->WriteFlipped<u16>( _x ); + _p_old->WriteFlipped<u16>( _y ); + _p_old->Write<u32>( _containerserial_ext ); + _p_old->WriteFlipped<u16>( _color ); + } + void AddItemContainerMsg::build() + { + _p->offset = 1; + _p->Write<u32>( _serial_ext ); + _p->WriteFlipped<u16>( _graphic ); + _p->offset++; //unk7 layer? + _p->WriteFlipped<u16>( _amount ); + _p->WriteFlipped<u16>( _x ); + _p->WriteFlipped<u16>( _y ); + _p->Write<u8>( _slotindex ); + _p->Write<u32>( _containerserial_ext ); + _p->WriteFlipped<u16>( _color ); + } + + void AddItemContainerMsg::Send( Client* client ) + { + if ( client->ClientType & CLIENTTYPE_6017 ) + { + if ( _p->offset == 1 ) + build(); + _p.Send( client, 21 ); + } + else + { + if ( _p_old->offset == 1 ) + buildLegacy(); + _p_old.Send( client, 20 ); + } + } + } +} \ No newline at end of file Property changes on: trunk/pol-core/pol/network/packetdefs.cpp ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/pol-core/pol/network/packetdefs.h =================================================================== --- trunk/pol-core/pol/network/packetdefs.h (rev 0) +++ trunk/pol-core/pol/network/packetdefs.h 2014-08-02 17:55:53 UTC (rev 831) @@ -0,0 +1,90 @@ + +#ifndef POL_PACKETDEFS_H +#define POL_PACKETDEFS_H + +#include "packets.h" +#include "../../clib/rawtypes.h" + +namespace Pol { + namespace Mobile { + class Character; + } + namespace Network { + class Client; + + class PktSender + { + public: + virtual void Send( Client* client ) =0; + }; + + class SendWorldItem : public PktSender + { + public: + SendWorldItem( u32 serial, u16 graphic, u16 amount, u16 x, u16 y, s8 z, u8 facing, u16 color, u8 flags ); + virtual void Send( Client* client ); + void updateFlags( u8 flags ); + private: + void buildF3(); + void build1A(); + u16 _p_oldlen; + u32 _serial; + u16 _graphic; + u16 _amount; + u16 _x; + u16 _y; + s8 _z; + u8 _facing; + u16 _color; + u8 _flags; + PktHelper::PacketOut<PktOut_1A> _p_old; + PktHelper::PacketOut<PktOut_F3> _p; + }; + + class SendWorldMulti : public PktSender + { + public: + SendWorldMulti( u32 serial_ext, u16 graphic, u16 x, u16 y, s8 z, u16 color ); + virtual void Send( Client* client ); + private: + void buildF3(); + void build1A(); + u16 _p_oldlen; + u32 _serial_ext; + u16 _graphic; + u16 _x; + u16 _y; + s8 _z; + u16 _color; + PktHelper::PacketOut<PktOut_1A> _p_old; + PktHelper::PacketOut<PktOut_F3> _p; + }; + + class AddItemContainerMsg : public PktSender + { + public: + AddItemContainerMsg( u32 serial_ext, u16 graphic, u16 amount, u16 x, u16 y, u8 slotindex, u32 containerserial_ext, u16 color ); + virtual void Send( Client* client ); + private: + void buildLegacy(); + void build(); + u32 _serial_ext; + u16 _graphic; + u16 _amount; + u16 _x; + u16 _y; + u8 _slotindex; + u32 _containerserial_ext; + u16 _color; + PktHelper::PacketOut<PktOut_25> _p_old; + PktHelper::PacketOut<PktOut_25> _p; + }; + + + + + + + } +} +#endif Property changes on: trunk/pol-core/pol/network/packetdefs.h ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |