SimpleTorrent
结构体 | 宏定义 | 函数
connect.c 文件参考

网络连接相关 API 实现 更多...

#include "util.h"
#include "metainfo.h"
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <pthread.h>
connect.c 的引用(Include)关系图:

结构体

struct  HttpRequest
 描述一个 HTTP 请求 更多...
 

宏定义

#define REQUEST_MAX   1024
 HTTP 报文缓冲区的最大长度
 

函数

void parse_url (const char *url, char *method, char *host, char *port, char *request)
 解析 url 获取应用层协议、主机名、端口号 更多...
 
struct HttpRequestcreate_http_request (const char *method, const char *host)
 创建一个 HTTP 请求 更多...
 
void add_http_request_attr (struct HttpRequest *req, const char *key, const char *fmt,...)
 增加一个请求属性 更多...
 
int send_http_request (struct HttpRequest *req, int sfd)
 发送一个 HTTP 请求 更多...
 
int make_nonblocking (int sfd)
 将套接字设置成非阻塞的 更多...
 
int make_blocking (int sfd)
 将套接字设置成阻塞的 更多...
 
int async_connect (int efd, int sfd, const struct sockaddr *addr, socklen_t addrlen)
 异步 connect 更多...
 
void * async_connect_to_tracker_non_block (void *arg)
 异步连接线程 更多...
 
void async_connect_to_tracker (struct Tracker *tracker, int efd)
 异步地与 tracker 建立连接,调用后连接并不立即建立 更多...
 

详细描述

网络连接相关 API 实现

函数说明

void add_http_request_attr ( struct HttpRequest req,
const char *  key,
const char *  fmt,
  ... 
)

增加一个请求属性

参数
reqHTTP 请求句柄
key属性键
fmt... 属性值 [可格式化]

这是这个函数的调用关系图:

int async_connect ( int  efd,
int  sfd,
const struct sockaddr *  addr,
socklen_t  addrlen 
)

异步 connect

参数
efdepoll 描述符
sfd连接套接字
addr连接地址
addrlen地址结构体长度
返回
如果立即 connect 返回 0,异步连接时应该返回 errno,应当是 EINPROGRESS

如果 connect 能够立即完成,直接返回;否则,将描述符加入 epoll, 侦听 EPOLLOUT 事件,同时要关注 EPOLLERR 和 EPOLLHUP 处理实际错误。

这是这个函数的调用关系图:

void async_connect_to_tracker ( struct Tracker tracker,
int  efd 
)

异步地与 tracker 建立连接,调用后连接并不立即建立

参数
tracker指向 tracker 信息的指针
efdepoll file descriptor,创建的套接字会加入该队列中,侦听 EPOLLOUT

这是这个函数的调用关系图:

void* async_connect_to_tracker_non_block ( void *  arg)

异步连接线程

本函数主要是为了规避 getaddrinfo 的阻塞,一个重要的隐含前提是通过 tracker 的 sfd 来传递 efd。 毕竟 sfd 作为连接套接字在调用时是没有意义的。

参数
arg实际上是指向 tracker 的指针
返回
NULL

这是这个函数的调用关系图:

struct HttpRequest* create_http_request ( const char *  method,
const char *  host 
)

创建一个 HTTP 请求

参数
method请求方法, 主要用 GET
host主机名
返回
动态分配的实例句柄

这是这个函数的调用关系图:

int make_blocking ( int  sfd)

将套接字设置成阻塞的

参数
sfd套接字
返回
成功返回 0,错误返回 -1.

这是这个函数的调用关系图:

int make_nonblocking ( int  sfd)

将套接字设置成非阻塞的

参数
sfd套接字
返回
成功返回 0,错误返回 -1.

这是这个函数的调用关系图:

void parse_url ( const char *  url,
char *  method,
char *  host,
char *  port,
char *  request 
)

解析 url 获取应用层协议、主机名、端口号

解析 URL

参数
url指向 url 字符串
method接收应用层协议名
host接收主机名
port接收端口号
requesthttp 请求路径,一般是 /announce

自行保证缓冲区大小,host 和 port 可以使用 NI_MAXHOST 和 NI_MAXSERV. method 一般是 http 或者 udp.

这是这个函数的调用关系图:

int send_http_request ( struct HttpRequest req,
int  sfd 
)

发送一个 HTTP 请求

参数
reqHTTP 请求句柄
sfd连接套接字
返回
成功返回 0, 失败返回 -1

这是这个函数的调用关系图: