common.h
来自「elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, el」· C头文件 代码 · 共 439 行
H
439 行
#ifndef EL__PROTOCOL_BITTORRENT_COMMON_H#define EL__PROTOCOL_BITTORRENT_COMMON_H#include "main/timer.h"#include "network/progress.h"#include "network/socket.h"#include "network/state.h"#include "protocol/protocol.h"#include "protocol/uri.h"#include "util/error.h"#include "util/lists.h"#include "util/md5.h"#include "util/sha1.h"#include "util/time.h"struct bitfield;struct bittorrent_fetcher;struct connection;struct terminal;/* The least acceptable default sharing rate. */#define BITTORRENT_DEFAULT_SHARING_RATE 0.250/* The number of seconds between updating the connection state and most * importantly choke and unchoke peer connections. */#define BITTORRENT_DEFAULT_CHOKE_INTERVAL 10/* The length regarded as ``typical'' by the community wiki specification. *//* Looks like Bram uses 2^14 here. *//* Used for the protocol.bittorrent.request_length option */#define BITTORRENT_REQUEST_LENGTH (1 << 14)/* The length of requested blocks of pieces should not exceed 2^17 bytes. *//* Used for the protocol.bittorrent.max_request_length option *//* Bram uses 2^23 here. */#define BITTORRENT_REQUEST_ACCEPT_LENGTH (1 << 23)/* The maximum size to allow a peer message to have. *//* Bram uses 2^23 here. */#define BITTORRENT_MESSAGE_MAX_SIZE (1 << 23)/* 20-byte string ID used for both peer IDs and info-hashes. */typedef sha1_digest_bin_T bittorrent_id_T;/* Special peer ID used for determining whether an ID has been set. */const bittorrent_id_T BITTORRENT_NULL_ID;#define bittorrent_id_is_empty(id) \ (!memcmp(id, BITTORRENT_NULL_ID, sizeof(bittorrent_id_T)))/* BitTorrent error states. */enum bittorrent_state { BITTORRENT_STATE_OK, /* All is well. */ BITTORRENT_STATE_ERROR, /* Some error happened. */ BITTORRENT_STATE_REQUEST_FAILURE, /* Failure from tracker. */ BITTORRENT_STATE_OUT_OF_MEM, /* Allocation failure. */ BITTORRENT_STATE_CACHE_FAILURE, /* Cache data access failed. */ BITTORRENT_STATE_CACHE_RESUME, /* Resume state from disk.. */ BITTORRENT_STATE_FILE_MISSING, /* File does not exist. */};/* For showing tracker failure responses to the user. */struct bittorrent_message { LIST_HEAD(struct bittorrent_message); struct uri *uri; enum connection_state state; unsigned char string[1];};/* ************************************************************************** *//* Peer-wire types: *//* ************************************************************************** *//* BitTorrent peer-wire state and message IDs. */enum bittorrent_message_id { /* Special internal state and message type. */ BITTORRENT_MESSAGE_ERROR = -3, BITTORRENT_MESSAGE_INCOMPLETE = -2, BITTORRENT_MESSAGE_KEEP_ALIVE = -1, /* Valid message types. */ BITTORRENT_MESSAGE_CHOKE = 0, BITTORRENT_MESSAGE_UNCHOKE = 1, BITTORRENT_MESSAGE_INTERESTED = 2, BITTORRENT_MESSAGE_NOT_INTERESTED = 3, BITTORRENT_MESSAGE_HAVE = 4, BITTORRENT_MESSAGE_BITFIELD = 5, BITTORRENT_MESSAGE_REQUEST = 6, BITTORRENT_MESSAGE_PIECE = 7, BITTORRENT_MESSAGE_CANCEL = 8,};/* The peer request matches information sent in the request and cancel messages * in the peer-wire protocol. See the piece cache header file (cache.h) for more * information about the cloned flag. */struct bittorrent_peer_request { LIST_HEAD(struct bittorrent_peer_request); uint32_t piece; /* Zero-based piece index. */ uint32_t offset; /* Zero-based piece byte offset. */ uint32_t length; /* The wanted number of bytes. */ uint16_t block; /* The block index in the piece. */ /* This holds the message id when the request struct is used for queuing * pending messages. */ char id; /* -> enum bittorrent_message_id */ unsigned int cloned:1; /* The request was cloned. */ unsigned int requested:1; /* Whether it has been requested. */};struct bittorrent_peer_status { /* FIFO-like recording of requests. */ struct list_head requests; /* -> struct bittorrent_peer_request */ /* Flags for scheduling updating of the peer state. */ unsigned int choked:1; /* The peer was choked. */ unsigned int interested:1; /* The peer is interested. */ unsigned int snubbed:1; /* The peer was snubbed. */ /* State flags used for determining what to accept. */ unsigned int handshake:1; /* The handshake was sent. */ unsigned int bitfield:1; /* The bitfield was sent. */ unsigned int initiater:1; /* Initiater of the connection. */ unsigned int seeder:1; /* The peer has the complete torrent. */};struct bittorrent_peer_stats { time_t last_time; time_t age; double download_rate; double have_rate; off_t downloaded; off_t uploaded;};/* Peer connection information. */struct bittorrent_peer_connection { LIST_HEAD(struct bittorrent_peer_connection); /* Unique peer ID string which can be used to look-up the peer hash. */ bittorrent_id_T id; /* Timer handle for scheduling timeouts. */ timer_id_T timer; /* Socket information. */ struct socket *socket; /* Progress information and counter for the number of uploaded or * downloaded bytes depending on the mode. */ struct bittorrent_peer_stats stats; /* The BitTorrent connection the peer connection is associated with. * For recently accepted peer connections it might be NULL indicating * that the info_hash has not yet been read from the handshake. */ struct bittorrent_connection *bittorrent; /* Local client and remote peer status info. */ struct bittorrent_peer_status local; struct bittorrent_peer_status remote; /* Outgoing message queue. Note piece messages are maintained entirely * in the request list in the bittorrent_peer_status struct. */ struct list_head queue; /* -> struct bittorrent_peer_request */ /* A bitfield of the available pieces from the peer. */ /* The size depends on the number of pieces. */ struct bitfield *bitfield;};/* ************************************************************************** *//* Tracker types: *//* ************************************************************************** *//* Event state information needed by the tracker. */enum bittorrent_tracker_event { BITTORRENT_EVENT_STARTED = 0, /* XXX: Zero, to always send first */ BITTORRENT_EVENT_STOPPED, /* Graceful shut down */ BITTORRENT_EVENT_COMPLETED, /* Download was completed */ BITTORRENT_EVENT_REGULAR, /* Regular (periodical) tracker request */};/* This stores info about tracker requests. *//* It is not a real connection because it consists of a series of HTTP requests * but both the tracker and client is supposed to keep state information across * all requests. */struct bittorrent_tracker_connection { /* Used for keeping track of when to send event info to the tracker. */ enum bittorrent_tracker_event event; /* Time in seconds between contacting the tracker and a timer handle. */ timer_id_T timer; int interval; /* Requesting the tracker failed or was never started so no * event=stopped should be sent. */ unsigned int failed:1; unsigned int started:1;};/* ************************************************************************** *//* Metafile types: *//* ************************************************************************** *//* Information about peers returned by the tracker. */struct bittorrent_peer { LIST_HEAD(struct bittorrent_peer); bittorrent_id_T id; /* Unique peer ID string. */ uint16_t port; /* The port number to connect to. */ unsigned char ip[1]; /* String with a IPv4 or IPv6 address. */};/* Information about a file in the torrent. */struct bittorrent_file { LIST_HEAD(struct bittorrent_file); off_t length; /* Length of the file in bytes. */ md5_digest_hex_T md5sum; /* Hexadecimal MD5 sum of the file. */ int selected; unsigned char name[1]; /* Filename converted from path list. */};/* Static information from the .torrent metafile. */struct bittorrent_meta { /* The SHA1 info hash of the value of the info key from the metainfo * .torrent file is used regularly when connecting to both the tracker * and peers. */ bittorrent_id_T info_hash; /* Optional information about the creation time of the torrent. */ /* Used if the document.download.set_original_time is true. */ time_t creation_date; /* Optional comment in free-form text. */ unsigned char *comment; /* The announced URI of each available tracker. */ struct uri_list tracker_uris; /* The number of pieces. */ uint32_t pieces; /* The number of bytes in each piece. The last piece can be shorter * than the others. */ uint32_t piece_length; uint32_t last_piece_length; /* List of concatenated SHA1 hash values for each piece. */ unsigned char *piece_hash; /* The type of the torrent. */ enum { BITTORRENT_SINGLE_FILE, BITTORRENT_MULTI_FILE } type; unsigned int malicious_paths:1; /* Potential bad file path detected. */ /* The name of either the single file or the top-most directory. */ unsigned char *name; /* A list with information about files in the torrent. */ /* The list is a singleton for single-file torrents. */ struct list_head files; /* -> struct bittorrent_file */};enum bittorrent_connection_mode { BITTORRENT_MODE_PIECELESS, /* The client has no piece to share. */ BITTORRENT_MODE_NORMAL, /* The client is up- and downloading. */ BITTORRENT_MODE_END_GAME, /* All remaining pieces are requested. */ BITTORRENT_MODE_SEEDER, /* The client is only uploading. */};/* This stores info about an active BitTorrent connection. Note, the list head * is used by the handling of the peer-wire listening socket and should only be * managed by that. */struct bittorrent_connection { LIST_HEAD(struct bittorrent_connection); enum bittorrent_connection_mode mode; /* Static information from the .torrent metafile. */ struct bittorrent_meta meta; /* Dynamic tracker information. */ struct bittorrent_tracker_connection tracker; /* Dynamic tracker information. */ struct bittorrent_piece_cache *cache; /* Back-reference to the connection the bittorrent connection belongs * to. */ struct connection *conn; /* Active peer list */ /* The size is controlled by the protocol.bittorrent.max_active_peers * option. */ struct list_head peers; /* -> struct bittorrent_peer_connection */ /* List of information about potential peers. */ /* TODO: Use hash. */ struct list_head peer_pool; /* -> struct bittorrent_peer */ /* The peer ID of the client. */ bittorrent_id_T peer_id; /* The port of the listening socket */ uint16_t port; /* Timer handle for scheduling periodic updating and rating of peer * connections. */ timer_id_T timer; /* Statistics for the tracker and total progress information for the * user interface. */ struct progress upload_progress; off_t uploaded; off_t downloaded; off_t left; /* Number of seeders and leechers. */ uint32_t complete; uint32_t incomplete; double sharing_rate; /* Information about any running metainfo file or tracker request. */ struct bittorrent_fetcher *fetch; /* For notifying on completion. May be NULL. */ struct terminal *term;};static inline uint32_tget_bittorrent_piece_length(struct bittorrent_meta *meta, uint32_t piece){ return piece == meta->pieces - 1 ? meta->last_piece_length : meta->piece_length;}unsigned char *get_hexed_bittorrent_id(bittorrent_id_T id);intbittorrent_piece_is_valid(struct bittorrent_meta *meta, uint32_t piece, unsigned char *data, uint32_t datalen);void init_bittorrent_peer_id(bittorrent_id_T peer_id);intbittorrent_id_is_known(struct bittorrent_connection *bittorrent, bittorrent_id_T id);enum bittorrent_stateadd_peer_to_bittorrent_pool(struct bittorrent_connection *bittorrent, bittorrent_id_T id, int port, unsigned char *ip, int iplen);struct bittorrent_peer *get_peer_from_bittorrent_pool(struct bittorrent_connection *bittorrent, bittorrent_id_T id);void done_bittorrent_meta(struct bittorrent_meta *meta);void done_bittorrent_message(struct bittorrent_message *message);/* ************************************************************************** *//* Debug 'pretty printing' functions: *//* ************************************************************************** */unsigned char *get_peer_id(bittorrent_id_T peer);unsigned char *get_peer_message(enum bittorrent_message_id message_id);/* ************************************************************************** *//* Peer request management: *//* ************************************************************************** */struct bittorrent_peer_request *get_bittorrent_peer_request(struct bittorrent_peer_status *status, uint32_t piece, uint32_t offset, uint32_t length);voidadd_bittorrent_peer_request(struct bittorrent_peer_status *status, uint32_t piece, uint32_t offset, uint32_t length);voiddel_bittorrent_peer_request(struct bittorrent_peer_status *status, uint32_t piece, uint32_t offset, uint32_t length);/* ************************************************************************** *//* URI fetching: *//* ************************************************************************** */typedef void (*bittorrent_fetch_callback_T)(void *, enum connection_state, struct string *);struct bittorrent_fetcher *init_bittorrent_fetch(struct bittorrent_fetcher **fetcher_ref, struct uri *uri, bittorrent_fetch_callback_T callback, void *data, int delete);void done_bittorrent_fetch(struct bittorrent_fetcher **fetcher_ref);/* ************************************************************************** *//* Blacklisting: *//* ************************************************************************** */enum bittorrent_blacklist_flags { BITTORRENT_BLACKLIST_NONE, /* No blacklisting is in effect */ BITTORRENT_BLACKLIST_PEER_POOL, /* Blacklist from peer pool. */ BITTORRENT_BLACKLIST_MALICIOUS, /* Malicious peer, refuse connection */ BITTORRENT_BLACKLIST_BEHAVIOUR, /* Unfair behaviour, refuse connection */};voidadd_bittorrent_blacklist_flags(bittorrent_id_T peer_id, enum bittorrent_blacklist_flags flags);voiddel_bittorrent_blacklist_flags(bittorrent_id_T peer_id, enum bittorrent_blacklist_flags flags);enum bittorrent_blacklist_flagsget_bittorrent_blacklist_flags(bittorrent_id_T peer_id);void done_bittorrent_blacklist(void);#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?