00001 #include "packetmanager.h"
00002
00003 namespace n2nc {
00004
00005 PacketManager::PacketManager(net::Socket *sk) : Socket() {
00006
00007
00008
00009
00010
00011 this->m_sk = sk;
00012 this->m_sendbuf = ::malloc(65535);
00013 this->m_recvbuf = ::malloc(65535);
00014 bzero(&this->m_pklastsent,sizeof(srv_packet_header_t));
00015 bzero(&this->m_pklastrecvd,sizeof(srv_packet_header_t));
00016 totalsent = 0;
00017 totalrecvd = 0;
00018
00019 }
00020
00021
00022 PacketManager::~PacketManager(){
00023 ::free(this->m_sendbuf);
00024 ::free(this->m_recvbuf);
00025 }
00026
00027 int PacketManager::send(void * buf, size_t len){
00028
00029 srv_packet_header tosend ;
00030 bzero(&tosend,sizeof(tosend));
00031
00032 tosend.p_size = len ;
00033 tosend.p_seq = m_pklastsent.p_seq + 1;
00034 tosend.h_type = SRV_PK_DATA ;
00035 this->m_pklastsent = tosend ;
00036
00037
00038 memcpy(this->m_sendbuf,&tosend,sizeof(srv_packet_header));
00039
00040 memcpy((u_char*)this->m_sendbuf + sizeof(srv_packet_header),buf,len);
00041
00042
00043 totalsent += len + sizeof(srv_packet_header) ;
00044
00045 return this->m_sk->send(this->m_sendbuf,len + sizeof(srv_packet_header));
00046
00047 }
00048
00049 int PacketManager::recv(void * buf, size_t len){
00050 int recvlen ;
00051 srv_packet_header recvpk ;
00052 recvlen = this->m_sk->recv(this->m_recvbuf,len);
00053 if (recvlen < 0) {
00054 std::cerr << "PKM RECV ERROR. DISCARDING PACKET" << std::endl ;
00055 return -1 ;
00056 }
00057 totalrecvd += recvlen;
00058
00059
00060 if (recvlen < sizeof(srv_packet_header)) {
00061 std::cerr << "\tPKM.received data, but the packet lenght is to small. Discarding packet" << std:: endl ;
00062 return -1 ;
00063 }
00064
00065 ::memcpy(&recvpk,this->m_recvbuf,sizeof(srv_packet_header));
00066 if ( recvpk.h_type != SRV_PK_DATA){
00067 std::cerr << "\tPKM.discarding packet, header doesn't match my pattern" << std:: endl ;
00068 return -1 ;
00069 }
00070 if (recvpk.p_size != (recvlen - sizeof(srv_packet_header))){
00071 std::cerr << "\tPKM.discarding packet, lenght mismatch. expected: " << recvpk.p_size << " read: " << recvlen - sizeof(srv_packet_header) << std:: endl ;
00072 return -1 ;
00073 }
00074 this->m_pklastrecvd = recvpk;
00075 memcpy(buf,(u_char*)this->m_recvbuf + sizeof(srv_packet_header),recvpk.p_size );
00076 return recvpk.p_size ;
00077
00078 }
00079
00080 PacketManager::srv_packet_header_t *PacketManager::getRecvPkHeader(){
00081 return &this->m_pklastrecvd ;
00082 }
00083
00084 PacketManager::srv_packet_header_t *PacketManager::getSendPkHeader(){
00085 return &this->m_pklastsent ;
00086 }
00087
00088 }
00089
00090
00091
00092
00093
00094
00095