函数及变量的解释:
WSADATA : 存储由WSAStartup函数返回的数据。
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);
启动异步套接字,加载运行库
wVersionRequest : 高阶字段表示小版本号,低位字段表示主版本号
lpWSAData: 指向WSADATA的指针。
int socket( int af, int type, int protocol);
根据指定协议族、数据类型、协议来分配一个套接口
af : 地址描述,目前仅支持AF_INET
type :指定socket类型,SOCK_STREAM是面向连接的socket,SOCK_DGRAME是无连接的socket,SOCK_RAW是原始套接字,可以接收到本机网卡上的数据帧。
protocol : 指定协议。IPPROTO_TCP , IPPROTO_UDP,IPPROTO_ICMP等等
sockaddr_in
作为bind、connect、recvfrom、sendto函数中指明地址的信息。
内部成员:
short sin_family 指明协议族
u_short sin_port 端口号,必须是网络字节流
sin_addr 类型为in_addr,真正存储IP的是s_addr,s_addr其实就是一个 u_int 类型的数据,其中存储的IP地址为网络字节流形式。
in_addr
in_addr 这个结构体中只有一个u_int的变量,用来存储网络字节顺序的IP地址
既然只有一个变量,还定义个毛结构体,出了好多麻烦事
htons(u_short x)
ntohs(u_short x)
将网络字节序的u_short x转变为主机字节序
ntohl(u_long x)
将网络字节序的u_long x转变为主机字节序
in_addr_t inet_addr(const char* strptr);
in_addr_t = u_int
如果字符串有效,把字符串转变为网络字节序的 IPV4地址,返回类型为u_int
gethostbyname(char * name)
通过主机名获得主机的信息
hostent *p
gethostbyname的返回类型
char ** h_addr_list : 主机网络地址的指针,网络字节顺序,以字符串的形式描述一个IP地址,如果对sockaddr_in中存储IP地址的变量进行赋值,需要进行强制转换。
char *inet_ntoa(in_addr in)
将一个in_addr 的网络字节流转换为点分十进制的IP地址
注意 sockaddr_in.sin_addr的类型就是 in_addr,可以作为参数直接传进去
int sendto(SOCKET s,char *buf,int blen,int flags,sockaddr *to,int tlen);
flags 用来改变sendto发送的形式
适用于发送无连接的UDP数据包