一、 Winsock
winsock 是一种标准API,主要用于网络中的数据通信,它允许两个或者多个应用程序在同一台机器上或者通过网络相互通信。
winsock 是一种网络编程的接口,而不是协议。
1.1 Winsock 的初始化
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested---指定准备加载的Winsock 库的版本,高位字节指定所需要Winsock库的次版本,低位字节指定主版本 使用宏 MAKEWORD(x,y)(x--高位字节,y--低位字节)来方便的获得 wVersionRequested 的正确值
lpWSAData ----- 指向LPWSADATA 结构的指针
typedef struct WSAData
{ WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
}
WSADATA, FAR * LPWSADATA;
在使用Winsock 接口编写好应用程序之后,应该调用WSACleanup 函数,这个函数能够使Winsock 释放所有由Winsock分配的资源,并取消这个应用程序挂起的Winsock 调用
int WASCleanup(void);
1.2 协议寻址
通过 SOCKADDR_IN 结构来指定IP地址和服务端口信息,
struct sockaddr_in{
short sin_family; //必须设为 AF_INET,一遍告诉winsock此时正在使用IP地址族
unsigned short sin_port; //通信端口号
struct in_addr sin_addr;
char sin_zero[8]; //填充
};
把一个点分IP地址转换为一个32位无符号长整数
unsigned long inet_addr(
const char FAR* cp
);
1.3 字节序
主机字节顺序-------->网络字节顺序
u_long htonl(u_long hcstlong);
int WSAHtonl(
SOCKET s,
u_long hostlong,
u_long FAR* lpnetlong
);
u_short htons(u_short hostshort);
int WSAHtons(
SOCKET s,
u_short hostshort,
u_short FAR* lpnetshort
);
网络字节顺序------->主机字节顺序
u_long ntohl(u_long netlong);
int WSANtohl(
SOCKET s,
u_long netlong,
u_long FAR* lphostlong
);
u_short ntohs(u_short netshort);
int WSANtohs(
SOCKET s,
u_short netshort,
u_short FAR* lphostshort
);
演示 如何利用inet_addr 和htons 函数来创建SOCKADDR_IN 结构,并进行IPV4 寻址
SOCKADDR_IN InternetAddr;
INT nPortId=5150;
InternetAddr.sin_family=AF_INET;
//
InternetAddr.sin_addr.s_addr=inet_addr("136.125.23.22");
InternetAddr.sin_port=htons(nPortId);
1.4 创建套接字
SOCKET socket(
int af, //af 是协议的地址族 IPV4---AF_INET
int type, //套接字类型 TCP/IP---->SOCK_STREAM, UDP/IP ----> SOCK_DGRAM
int protocol //用于在给地地址族和套接字类型具有多重入口时,对具体的传送做限定,
//TCP----->IPPROTO_TCP UDP---->IPPROTO_UDP
)