Panda3D
Loading...
Searching...
No Matches
datagramUDPHeader.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file datagramUDPHeader.cxx
10 * @author drose
11 * @date 2000-02-08
12 */
13
14#include "datagramUDPHeader.h"
15#include "netDatagram.h"
16#include "datagramIterator.h"
17#include "config_net.h"
18
19#include "pnotify.h"
20
21/**
22 * This constructor creates a header based on an already-constructed
23 * NetDatagram.
24 */
26DatagramUDPHeader(const NetDatagram &datagram) {
27 const unsigned char *begin = (const unsigned char *)datagram.get_data();
28 const unsigned char *end = begin + datagram.get_length();
29 uint16_t checksum = 0;
30 for (const unsigned char *p = begin; p != end; ++p) {
31 checksum += (uint16_t)(uint8_t)*p;
32 }
33
34 // Now pack the header.
35 _header.add_uint16(checksum);
36 nassertv((int)_header.get_length() == datagram_udp_header_size);
37}
38
39/**
40 * This constructor decodes a header from a block of data of length
41 * datagram_udp_header_size, presumably just read from a socket.
42 */
44DatagramUDPHeader(const void *data) : _header(data, datagram_udp_header_size) {
45}
46
47/**
48 * Verifies that the indicated datagram has the appropriate length and
49 * checksum. Returns true if it matches, false otherwise.
50 */
52verify_datagram(const NetDatagram &datagram) const {
53 const unsigned char *begin = (const unsigned char *)datagram.get_data();
54 const unsigned char *end = begin + datagram.get_length();
55 uint16_t checksum = 0;
56 for (const unsigned char *p = begin; p != end; ++p) {
57 checksum += (uint16_t)(uint8_t)*p;
58 }
59
60 if (checksum == get_datagram_checksum()) {
61 return true;
62 }
63
64 if (net_cat.is_debug()) {
65 net_cat.debug()
66 << "Invalid datagram!\n";
67 if (checksum != get_datagram_checksum()) {
68 net_cat.debug()
69 << " checksum is " << checksum << ", header reports "
70 << get_datagram_checksum() << "\n";
71 }
72
73 // We write the hex dump into a ostringstream first, to guarantee an
74 // atomic write to the output stream in case we're threaded.
75
76 std::ostringstream hex;
77 datagram.dump_hex(hex);
78 hex << "\n";
79 net_cat.debug(false) << hex.str();
80 }
81
82 return false;
83}
DatagramUDPHeader(const NetDatagram &datagram)
This constructor creates a header based on an already-constructed NetDatagram.
int get_datagram_checksum() const
Returns the checksum appropriate for the indicated datagram.
bool verify_datagram(const NetDatagram &datagram) const
Verifies that the indicated datagram has the appropriate length and checksum.
size_t get_length() const
Returns the number of bytes in the datagram.
Definition datagram.I:335
void dump_hex(std::ostream &out, unsigned int indent=0) const
Writes a representation of the entire datagram contents, as a sequence of hex (and ASCII) values.
Definition datagram.cxx:44
void add_uint16(uint16_t value)
Adds an unsigned 16-bit integer to the datagram.
Definition datagram.I:85
const void * get_data() const
Returns a pointer to the beginning of the datagram's data.
Definition datagram.I:327
A specific kind of Datagram, especially for sending across or receiving from a network.
Definition netDatagram.h:40
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.