@Override public void run() { try (Socket socket = Connection.this.socket) { initSocket(socket); if (mode == CLIENT || mode == SYNC) { send(new Version.Builder().defaults(ctx.getClientNonce()).addrFrom(host).addrRecv(node).build()); } while (state != DISCONNECTED) { if (mode != SYNC) { if (state == ACTIVE && requestedObjects.isEmpty() && sendingQueue.isEmpty()) { Thread.sleep(1000); } else { Thread.sleep(100); } } receive(); } } catch (Exception e) { LOG.trace("Reader disconnected from node " + node + ": " + e.getMessage()); } finally { disconnect(); try { socket.close(); } catch (Exception e) { LOG.debug(e.getMessage(), e); } } }
private void handleVersion(Version version) { if (version.getNonce() == ctx.getClientNonce()) { LOG.info("Tried to connect to self, disconnecting."); disconnect(); } else if (version.getVersion() >= BitmessageContext.CURRENT_VERSION) { this.peerNonce = version.getNonce(); if (peerNonce == ctx.getClientNonce()) disconnect(); this.version = version.getVersion(); this.streams = version.getStreams(); verackSent = true; send(new VerAck()); if (mode == SERVER) { send(new Version.Builder().defaults(ctx.getClientNonce()).addrFrom(host).addrRecv(node).build()); } if (verackReceived) { activateConnection(); } } else { LOG.info("Received unsupported version " + version.getVersion() + ", disconnecting."); disconnect(); } }
private static Version parseVersion(InputStream stream) throws IOException { int version = Decode.int32(stream); long services = Decode.int64(stream); long timestamp = Decode.int64(stream); NetworkAddress addrRecv = parseAddress(stream, true); NetworkAddress addrFrom = parseAddress(stream, true); long nonce = Decode.int64(stream); String userAgent = Decode.varString(stream); long[] streamNumbers = Decode.varIntList(stream); return new Version.Builder() .version(version) .services(services) .timestamp(timestamp) .addrRecv(addrRecv).addrFrom(addrFrom) .nonce(nonce) .userAgent(userAgent) .streams(streamNumbers).build(); }
private static Version parseVersion(InputStream stream) throws IOException { int version = Decode.int32(stream); long services = Decode.int64(stream); long timestamp = Decode.int64(stream); NetworkAddress addrRecv = parseAddress(stream, true); NetworkAddress addrFrom = parseAddress(stream, true); long nonce = Decode.int64(stream); String userAgent = Decode.varString(stream); long[] streamNumbers = Decode.varIntList(stream); return new Version.Builder() .version(version) .services(services) .timestamp(timestamp) .addrRecv(addrRecv).addrFrom(addrFrom) .nonce(nonce) .userAgent(userAgent) .streams(streamNumbers).build(); }
public ConnectionInfo(InternalContext context, Mode mode, NetworkAddress node, Map<InventoryVector, Long> commonRequestedObjects, long syncTimeout) { super(context, mode, node, commonRequestedObjects, syncTimeout); headerOut.flip(); if (mode == CLIENT || mode == SYNC) { send(new Version.Builder().defaults(ctx.getClientNonce()).addrFrom(host).addrRecv(node).build()); } }