JK转至:https://www.cnblogs.com/hgwang/p/6074038.html
流程图:
0:函数库头文件
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib ")
1:WSAStartup 初始化Ws2_32.dll的函数
WSAStartup 函数用于初始化供进程调用的Winsock相关的dll。
1 int WSAStartup( 2 __in WORD wVersionRequested, 3 __out LPWSADATA lpWSAData 4 );
Parameters
-
wVersionRequested
-
标识了用户调用的Winsock的版本号。高字节指明辅版本编号,低字节指明主版本编号。通常使用MAKEWORD来生成一个版本号。 当前Winsock sockets的版本号为2.2,用到的dll是 Ws2_32.dll。
lpWSAData
-
指向WSADATA结构体的指针,lpWSAData返回了系统对Windows Sockets 的描述。
Return Value
如果调用成功,WSAStartup 函数返回0。否则,将返回五种错误代码之一。但绝对不能使用WSAGetLastError获取错误代码。
WSAData wsa; if (::WSAStartup(MAKEWORD(2,2),&wsa) != 0) { cout<<"WSAStartup error"<<endl; return 0; }
2:WSACleanup 释放Ws2_32.dl的l函数
该函数释放对Winsock链接库的调用。
int WSACleanup(void);
返回值0表示正常退出,返回值SOCKET_ERROR表示异常。返回值是SOCKET_ERROR,可以调用 WSAGetLastError.查看错误代码。需要注意的是,在多线程环境下,WSACleanup 函数将终止所有线程的socket操作。
3:socket 创建socket的函数
socket函数将创建指定传输服务的socket。
1 SOCKET WSAAPI socket( 2 __in int af, 3 __in int type, 4 __in int protocol 5 );
Parameters
af ( address family)
指明地址簇类型,常用的地址簇如下,其余地址簇在Winsock2.h中定义。
AF_UNSPEC(未指明)、
AF_INET(IPv4)、
AF_NETBIOS(NETBIOS地址簇)、
AF_INET6(IPv6)、
AF_IRDA(Infrared Data Association (IrDA)地址簇)、
AF_BTM(Bluetooth)。
type
指明socket的类型,Windows Sockets 2常见类型如下:
SOCK_STREAM(流套接字,使用TCP协议)、
SOCK_DGRAM(数据报套接字,使用UDP协议)、
SOCK_RAW(原始套接字)、
SOCK_RDM(提供可靠的消息数据报文,reliable message datagram)、
SOCK_SEQPACKET(Provides a pseudo-stream packet based on datagrams,在UDP的基础上提供了伪流数据包)。
protocol
指明数据传输协议,该参数取决于af和type参数的类型。protocol参数在Winsock2.h and Wsrm.h定义。通常使用如下3中协议:
IPPROTO_TCP(TCP协议,使用条件