WinSock API相关函数
winsock提供了很多套接字函数,用户通过这些函数可以很容易的进行网络编程。
1、socket函数
socket函数用户创建一个套接字。
SOCKET socket(
int af, //标识一个地址家族,通常为AF_INET
int type, //标识套接字类型;SOCK_STREAM,表示流式套接字;SOCK_DGRAM,表示数据报套接字
int protocol //标识一个特殊的协议被用于这个套接字,通常为0,表示采用默认的TCP/IP协议。
);
2、accept函数
accept函数是用于接收客户端的连接请求。返回值是一个新的套接字,它对应于已经接受的客户端连接,对于该客户端的所有后续操作,都应使用这个新的套接字。
SOCKET accept(
SOCKET s, //是一个套接字,它应该处于监听状态
struct sockaddr FAR* addr, //是一个sockaddr结构体指针,包含一组客户端的端口号和ip地址信息
int FAR* addrlen //接收addr的长度
)
3、bind函数
bind函数用于将套接字绑定到一个已知的地址上。如果函数执行成功,返回0;否则返回SOCKET_ERROR
int bind(
SOCKET s, //是一个套接字
const struct sockaddr FAR* name, //该参数,包含了要绑定的端口号和ip地址
int namelen //确定缓冲区的长度
);
在定义一个套接字后,需要用bind函数为其指定本机地址、协议和端口号。
例如,创建一个套接字,将其绑定在3010端口上,其代码如下:
int port = 3010;
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
sockaddr_in addr;
addr.sin_family = AF_INET; //内部网络协议TCP/UDP等
addr.sin_port = htons(port); //端口号
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(s,(LPSOCKADDR)&addr,sizeof(addr)) == 0)
{
MessageBox("成功");
}
4、closesocket函数
closesocket函数用于关闭某个套接字。
int closesocket(
SOCKET s; //标识一个套接字
);
5、connect函数
connect函数用于发送一个连接请求,如果函数执行成功,返回0,否则返回SOCKET_ERROR。用户可以通过WSAGetLastError得到其错误描述。
int connect(
SOCKET s, //标识一个套接字
const struct sockaddr FAR* name, //套接字想要连接的主机地址和端口号
int namelen //name缓冲区的长度
);
6、htons函数
htons函数将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式。
u_short htons(
u_short hostshort //一个主机排列方式的无符号短整型数据
)
7、htonl函数
htonl函数将一个32位的无符号长整型数据有主机排列方式转换为网络排列方式。
u_long htonl(
u_long hostlong //一个主机排列方式的无符号长整型数据
)
8、inet_addr函数
inet_addr函数将一个由字符串标识的地址转换为32位的无符号长整型数据。
unsigned long inet_addr(
const char FAR* cp //一个表示ip地址的字符串
)
9、listen函数
listen函数用于将套接字置于监听模式。
int listen(
SOCKET s, //套接字
int backlog //表示等待连接的最大队列长度。例如,如果backlog=3,此时有4个客户端同时f发出连接请求,那么
//前3个会放置在等待队列中,第4个会得到错误信息。
)
10、recv函数
recv函数用于从连接的套接字中返回数据。
int recv(
SOCKET s, //标识一个套接字
char FAR* buf, //接收数据的缓冲区
int len, //buf的长度
int flags //表示函数的调用方式;MSG_PEEK_ 用来查看传来的数据,在序列前端的数据会被复制到
//返回的缓冲区中,但这个数据不会从序列中移走;MSG_OOB_ 用来处理Out_Of_Band数据
)
11、select函数
select函数用来检查一个或多个套接字是否处于可读、可写或错误状态。
int select(
int nfds, //没有实际意义,只是为了和UNIX下的套接字兼容
fd_set FAR* readfds, //标识一组被检查可读的套接字
fd_set FAR* writefds, //标识一组被检查可写的套接字
fd_set FAR* exceptfds, //被检查有错误的套接字
const struct timeval FAR* timeout //标识函数的等待时间
)
12、send函数
send函数在已经建立连接的套接字上发送数据。
int send(
SOCKET s, //标识一个套接字
const char FAR* buf, //存放要发送数据的缓冲区
int len, //标识缓冲区长度
int flags //标识函数的调用方式
)
13、WSAStartup函数
WSAStartup函数用于初始化WS2_32动态库,它应该是应用程序第一调用的windows socket函数,用于确定windows socket使用的版本。
int WSAStartup(
WORD wVersionRequested, //标识调用使用的windows socket的版本,高字节记录修订版本,低字节记录主版本
//例如,Windows socket的版本为2.1,则高字节记录1,低字节记录2。
LPWSADATA lpWSAData //记录Windows socket的详细信息
)
下面的代码用于确定windows socket使用的版本
WSADATA wsd;
WSAStartUp(MAKEWORD(2,2),&wsd);
14、WSACleanup函数
WSACleanup和WSAStartup是相对的,用于终止使用WS2_32动态库。
int WSACleanup(void);
说明:当windows socket使用完成时,应调用该函数释放分配给应用程序或动态库的资源。
15、WSAAsyncSelect函数
WSAAsyncSelect函数用于将网络中发生的事件关联到窗口的某个消息中。
int WSAAsyncSelect(
SOCKET s, //标识套接字
HWND hWnd, //标识窗口句柄
unsigned int wMsg, //标识窗口消息
long lEvent //标识网络中的事件
)