tinyhttpd学习笔记(一)编译错误及运行结果:http://blog.csdn.net/gqb1226/article/details/46844887
该篇博客开始分析相关代码.
一,结构体 sockaddr_in
该结构体的定义在netinet/in.h中定义
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
其中sin_family指的是协议族,在socket中常见的是AF_NET,即是使用IP
sin_port指的是端口号.
sin_addr是一个in_addr的结构体,该结构体可以理解为32的ip地址.
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
s_addr是按照网络字节序存储IP地址.
sin_zero是为了保持sockaddr和sockaddr_in两个数据结构大小一致而保留的空字节.
二,socket函数
在startup函数完成初始化 httpd 服务,包括建立套接字,绑定端口,进行监听等.其中有
httpd = socket(PF_INET, SOCK_STREAM,0);
socket()函数的原型是:
int socket(int domain, int type, int protocol);
该三个参数的含义是:
domain:表示通信域,如PF_UNIX(unix域),PF_INET(IPv4),PF_INET6(IPv6)等
type:表示通信类型,最常用的如SOCK_STREAM(面向连接可靠方式, 比如(TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如(UDP)等。 SOCK_STREAM 是数据流,一般是tcp/ip协议的编程,SOCK_DGRAM分是数据抱,是udp协议网络编程。
protocol:表示需要使用的协议,常用的协议有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议,使用0则根据前两个参数使用默认的协议。