diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-07-22 12:54:35 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-07-22 12:54:35 +0000 |
| commit | 65906c07fe8074013a52621fcc467e4bdfa0c51c (patch) | |
| tree | e5fee1667e9287d13fe6e1187dd109d008926455 /src/DHTRoutingTableSerializer.cc | |
| parent | 0d101d47c9beb6020242fd105993a0f023485588 (diff) | |
2009-07-22 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten stream error handling
* src/DHTAutoSaveCommand.cc
* src/DHTRoutingTableDeserializer.cc
* src/DHTRoutingTableSerializer.cc
* src/DHTSetup.cc
Diffstat (limited to 'src/DHTRoutingTableSerializer.cc')
| -rw-r--r-- | src/DHTRoutingTableSerializer.cc | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/src/DHTRoutingTableSerializer.cc b/src/DHTRoutingTableSerializer.cc index 20b4767f..9228bbb4 100644 --- a/src/DHTRoutingTableSerializer.cc +++ b/src/DHTRoutingTableSerializer.cc @@ -76,51 +76,53 @@ void DHTRoutingTableSerializer::serialize(std::ostream& o) char zero[16]; memset(zero, 0, sizeof(zero)); - try { - o.write(header, 8); - // write save date - uint64_t ntime = hton64(Time().getTime()); - o.write(reinterpret_cast<const char*>(&ntime), sizeof(ntime)); - // localnode - // 8bytes reserved - o.write(zero, 8); - // 20bytes localnode ID - o.write(reinterpret_cast<const char*>(_localNode->getID()), DHT_ID_LENGTH); - // 4bytes reserved - o.write(zero, 4); + o.write(header, 8); + // write save date + uint64_t ntime = hton64(Time().getTime()); + o.write(reinterpret_cast<const char*>(&ntime), sizeof(ntime)); + + // localnode + // 8bytes reserved + o.write(zero, 8); + // 20bytes localnode ID + o.write(reinterpret_cast<const char*>(_localNode->getID()), DHT_ID_LENGTH); + // 4bytes reserved + o.write(zero, 4); + + // number of nodes + uint32_t numNodes = htonl(_nodes.size()); + o.write(reinterpret_cast<const char*>(&numNodes), sizeof(uint32_t)); + // 4bytes reserved + o.write(zero, 4); - // number of nodes - uint32_t numNodes = htonl(_nodes.size()); - o.write(reinterpret_cast<const char*>(&numNodes), sizeof(uint32_t)); + // nodes + for(std::deque<SharedHandle<DHTNode> >::const_iterator i = _nodes.begin(); i != _nodes.end(); ++i) { + const SharedHandle<DHTNode>& node = *i; + // Currently, only IPv4 address and IPv4-mapped address are saved. + // 6bytes: write IP address + port in Compact IP-address/port info form. + unsigned char compactPeer[6]; + if(!PeerMessageUtil::createcompact(compactPeer, node->getIPAddress(), node->getPort())) { + memset(compactPeer, 0, 6); + } + // 1byte compact peer format length + o << static_cast<uint8_t>(sizeof(compactPeer)); + // 7bytes reserved + o.write(zero, 7); + // 6 bytes compact peer + o.write(reinterpret_cast<const char*>(compactPeer), 6); + // 2bytes reserved + o.write(zero, 2); + // 16bytes reserved + o.write(zero, 16); + // 20bytes: node ID + o.write(reinterpret_cast<const char*>(node->getID()), DHT_ID_LENGTH); // 4bytes reserved o.write(zero, 4); + } - // nodes - for(std::deque<SharedHandle<DHTNode> >::const_iterator i = _nodes.begin(); i != _nodes.end(); ++i) { - const SharedHandle<DHTNode>& node = *i; - // Currently, only IPv4 address and IPv4-mapped address are saved. - // 6bytes: write IP address + port in Compact IP-address/port info form. - unsigned char compactPeer[6]; - if(!PeerMessageUtil::createcompact(compactPeer, node->getIPAddress(), node->getPort())) { - memset(compactPeer, 0, 6); - } - // 1byte compact peer format length - o << static_cast<uint8_t>(sizeof(compactPeer)); - // 7bytes reserved - o.write(zero, 7); - // 6 bytes compact peer - o.write(reinterpret_cast<const char*>(compactPeer), 6); - // 2bytes reserved - o.write(zero, 2); - // 16bytes reserved - o.write(zero, 16); - // 20bytes: node ID - o.write(reinterpret_cast<const char*>(node->getID()), DHT_ID_LENGTH); - // 4bytes reserved - o.write(zero, 4); - } - } catch(std::ios::failure const& exception) { + o.flush(); + if(!o) { throw DL_ABORT_EX (StringFormat("Failed to save DHT routing table. cause:%s", strerror(errno)).str()); |
