00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "datagramTCPHeader.h"
00016 #include "netDatagram.h"
00017 #include "datagramIterator.h"
00018 #include "config_net.h"
00019
00020 #include "pnotify.h"
00021
00022
00023
00024
00025
00026
00027
00028 DatagramTCPHeader::
00029 DatagramTCPHeader(const NetDatagram &datagram, int header_size) {
00030 const string &str = datagram.get_message();
00031 switch (header_size) {
00032 case 0:
00033 break;
00034
00035 case datagram_tcp16_header_size:
00036 {
00037 PN_uint16 size = str.length();
00038 nassertv(size == str.length());
00039 _header.add_uint16(size);
00040 }
00041 break;
00042
00043 case datagram_tcp32_header_size:
00044 {
00045 PN_uint32 size = str.length();
00046 nassertv(size == str.length());
00047 _header.add_uint32(size);
00048 }
00049 break;
00050
00051 default:
00052 nassertv(false);
00053 }
00054
00055 nassertv((int)_header.get_length() == header_size);
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065 DatagramTCPHeader::
00066 DatagramTCPHeader(const void *data, int header_size) :
00067 _header(data, header_size)
00068 {
00069 }
00070
00071
00072
00073
00074
00075
00076
00077 int DatagramTCPHeader::
00078 get_datagram_size(int header_size) const {
00079 DatagramIterator di(_header);
00080 switch (header_size) {
00081 case 0:
00082 return 0;
00083
00084 case datagram_tcp16_header_size:
00085 return di.get_uint16();
00086
00087 case datagram_tcp32_header_size:
00088 return di.get_uint32();
00089 }
00090
00091 return -1;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101 bool DatagramTCPHeader::
00102 verify_datagram(const NetDatagram &datagram, int header_size) const {
00103 if (header_size == 0) {
00104
00105 return true;
00106 }
00107
00108 const string &str = datagram.get_message();
00109 int actual_size = str.length();
00110 int expected_size = get_datagram_size(header_size);
00111 if (actual_size == expected_size) {
00112 return true;
00113 }
00114
00115 if (net_cat.is_debug()) {
00116 net_cat.debug()
00117 << "Invalid datagram! Size is " << actual_size
00118 << " bytes, header reports " << expected_size << "\n";
00119
00120
00121
00122
00123 ostringstream hex;
00124 datagram.dump_hex(hex);
00125 hex << "\n";
00126 net_cat.debug() << hex.str();
00127 }
00128
00129 return false;
00130 }