libevent (hello-world代码源码)----evconnlistener、event中看了evconnlistener、event的定义,现在我们知道evconnlistener是用来描述tcp服务端的结构体,event结构里有3个event_callback,分别对应超时、io和信号事件。在libevent (hello-world代码源码)----event_base中可以知道event是event_base结构体管理的事件单位。
event_base管理一堆超时、io和信号触发的event事件。
sockaddr_in
让我们来看第四行:
struct sockaddr_in sin;
创建一个 描述网络连接参数的结构体,里面包含ip、端口、协议信息。
struct sockaddr_in
{
short sin_family;/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/
unsigned short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/
struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/
unsigned char sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/
};
WSAStartup
然后下面是:
#ifdef _WIN32
WSADATA wsa_data;
WSAStartup(0x0201, &wsa_data);
#endif
其中#ifdef _WIN32由编译器(ml.exe/ml64.exe)内部定义的。具体描述是:
_WIN32:Defined for applications for Win32 and Win64. Always defined.
_WIN64:Defined for applications for Win64.
windows平台上总是会有这种宏,所以用来判断是否是windows平台。
WSAStartup(0x0201, &wsa_data);
当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。为了在应用程序当中调用任何一个Winsock API,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务初始化。
所以这几行的意思就是如果是windows系统,初始化网络服务。(linux不需要)
event_base_new
接下来是创建新的event_base:
base = event_base_new();
if (!base) {
fprintf(stderr, "Could not initialize libevent!\n");
return 1;
}
event.h
event_base_new:
/**
* Create and return a new event_base to use with the rest of Libevent.
*
* @return a new event_base on success, or NULL on failure.
*
* @see event_base_free(), event_base_new_with_config()
创建并返回一个新的event_ base以与Libeven