windows套接字编程

Windows系统提供的套接字函数通常封装在Ws2_32.dll动态链接库中,其头文件Winsock2.h提供了套接字函数的原型,库文件Ws2_32.lib提供了Ws2_32.dll动态链接库的输出节。在使用套接字函数前,用户需要引用Winsock2.h头文件,并链接Ws2_32.lib库文件。例如:
#include "winsock2.h" //引用头文件
#pragma comment (lib,"ws2_32.lib") //链接库文件
此外,在使用套接字函数前还需要初始化套接字,可以使用WSAStartup函数来实现。例如:
WSADATA wsd; //定义WSADATA对象
WSAStartup(MAKEWORD(2,2),&wsd); //初始化套接字
下面介绍网络程序开发中经常使用的套接字函数。
(1)WSAStartup
该函数用于初始化Ws2_32.dll动态链接库。在使用套接字函数之前,一定要初始化Ws2_32.dll动态链接库。
语法:
int WSAStartup ( WORD wVersionRequested,LPWSADATA lpWSAData );
wVersionRequested:调用者使用的Windows Socket的版本,高字节记录修订版本,低字节记录主
版本。例如,如果Windows Socket的版本为2.1,则高字节记录1,低字节记录2。

lpWSAData:一个WSADATA结构指针,该结构详细记录了Windows套接字的相关信息。


(2)socket
该函数用于创建一个套接字。
语法:
SOCKET socket ( int af,int type, int protocol );

af:一个地址家族,通常为AF_INET。
type:套接字类型。如果为SOCK_STREAM,表示创建面向连接的流式套接字;为SOCK_DGRAM,表示创建面向无连接的数据报套接字;为SOCK_RAW,表示创建原始套接字。对于这些值,用户可以在Winsock2.h头文件中找到。
potocol:套接口所用的协议,如果用户不指定,可以设置为0。
返回值:创建的套接字句柄。
(3)bind
该函数用于将套接字绑定到指定的端口和地址上。
语法:
int bind (SOCKET s,const struct sockaddr FAR* name,int namelen );
s:套接字标识。
name:一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
namelen:确定name缓冲区的长度。
返回值:如果函数执行成功,返回值为0;否则为SOCKET_ERROR。
(4)listen
该函数用于将套接字设置为监听模式。对于流式套接字,必须处于监听模式才能够接收客户端套接字的连接。
语法:
int listen ( SOCKET s, int backlog);
s:套接字标识。
backlog:等待连接的最大队列长度。例如,如果backlog被设置为2,此时有3个客户端同时发出连接请求,那么前2个客户端连接会放置在等待队列中,第3个客户端会得到错误信息。
(5)accept
该函数用于接受客户端的连接。在流式套接字中,必须处于监听状态才能接受客户端的连接。
语法:
SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );
s:一个套接字,它应处于监听状态。
addr:一个sockaddr_in结构指针,包含一组客户端的端口号、IP地址等信息。
addrlen:用于接收参数addr的长度。
返回值:返回一个新的套接字,它对应于已经接受的客户端连接,对于该客户端的所有后续操作,都应使用这个新的套接字。

(6)losesocket
该函数用于关闭套接字。
语法:
int closesocket (SOCKET s);
s:标识一个套接字。如果参数s设置有SO_DONTLINGER选项,则调用该函数后会立即返回,但
此时如果有数据尚未传送完毕,会继续传递数据,然后才关闭套接字。
(7)connect
该函数用于发送一个连接请求。
语法:

int connect (SOCKET s,const struct sockaddr FAR* name,int namelen );
s:一个套接字。
name:套接字s想要连接的主机地址和端口号。
namelen:name缓冲区的长度。
返回值:如果函数执行成功,返回值为0;否则为SOCKET_ERROR。用户可以通过WSAGETLASTERROR
得到其错误描述。
(8)htons
该函数将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式。
语法:
u_short htons (u_short hostshort );
hostshort:一个主机排列方式的无符号短整型数据。
返回值:16位的网络排列方式数据。
(9)htonl
该函数将一个无符号长整型数据由主机排列方式转换为网络排列方式。
语法:
u_long htonl ( u_long hostlong);
Hostlong:一个主机排列方式的无符号长整型数据。
返回值:返回32位的网络排列方式数据。
(10)inet_addr
该函数将一个由字符串表示的地址转换为32位的无符号长整型数据。
语法:
unsigned long inet_addr (const char FAR * cp);
cp:一个IP地址的字符串。
返回值:返回32位无符号长整数。
(11)recv
该函数用于从面向连接的套接字中接收数据。
语法:
int recv (SOCKET s,char FAR* buf,int len,int flags);

s 表示一个套接字
buf 表示接收数据的缓冲区
len 表示buf的长度
flags 表示函数的调用方式。如果为MSG_PEEK,表示查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是该数据不会从序列中移走;为MSG_OOB,表示用来处理Out-Of-Band数据,也就是带外数据

(12)send
该函数用于在面向连接方式的套接字间发送数据。
语法:
int send (SOCKET s,const char FAR * buf, int len,int flags);

s 表示一个套接字
buf 表示存放要发送数据的缓冲区
len 表示缓冲区长度
flags 表示函数的调用方式

(13)select
该函数用来检查一个或多个套接字是否处于可读、可写或错误状态。
语法:
int select (int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds, const struct timeval FAR *timeout);

nfds 无实际意义,只是为了和UNIX下的套接字兼容
readfds 表示一组被检查可读的套接字
writefds 表示一组被检查可写的套接字
exceptfds 被检查有错误的套接字
timeout 表示函数的等待时间
(14)WSACleanup
该函数用于释放Ws2_32.dll动态链接库初始化时分配的资源。
语法:
int WSACleanup (void);
返回值:函数执行成功返回0。
(15)WSAAsyncSelect
该函数用于将网络中发生的事件关联到窗口的某个消息中。
语法:
int WSAAsyncSelect (SOCKET s, HWND hWnd,unsigned int wMsg,long lEvent);

s 表示套接字
hWnd 表示接收消息的窗口句柄
wMsg 表示窗口接收来自套接字中的消息
lEvent 表示网络中发生的事件

(16)ioctlsocket
该函数用于设置套接字的I/O模式。
语法:

int ioctlsocket(SOCKET s,long cmd,u_long FAR* argp);
 s:待更改I/O模式的套接字。
 cmd:对套接字的操作命令。如果为FIONBIO,当argp为0时,表示禁止非阻塞模式;当argp为非0时,表示设置非阻塞模式。如果为FIONREAD,表示从套接字中可以读取的数据量。为SIOCATMARK,表示是否所有的带外数据都已被读入。这个命令仅适用于流式套接字,并且该套接字已被设置为可以在线接收带外数据(SO_OOBINLINE)。
 argp:命令参数。
(17)WSAGetOverlappedResult
该函数用于获取重叠I/O操作完成时的结果。
语法:
BOOL WSAGetOverlappedResult(SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer,
BOOL fWait, LPDWORD lpdwFlags);

s 标识一个套接字
lpOverlapped 标识一个I/O重叠操作的结构指针,函数以此来查找该操作的结果
lpcbTransfer 表示本次操作实际接收或发送的字节数
fWait 为TRUE,则表示除非I/O操作完成,否则函数不会返回;为FALSE,表示如果I/O操作进行中,则函数立即返回FALSE
lpdwFlags 表示一组标记,通常来自于WSARecv函数的lpFlags参数
(18)CreateIoCompletionPort
该函数用于创建一个完成端口对象。
语法:
HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads);

FileHandle 表示完成端口关联对象。如果是创建完成端口,该参数为INVALID_HANDLE_VALUE
ExistingCompletionPort 表示关联FileHandle对象的完成端口,如果是创建完成端口,该参数为NULL
CompletionKey 表示端口的完成键值,用户可以指定一个自定义的结构指针,用于表示关联完成端口的附加数据
NumberOfConcurrentThreads 表示允许同时运行的用户线程的最大数量,通常设置为0,表示系统根据CPU的数量来确定


版权声明:

原文地址:https://www.cnblogs.com/walccott/p/4957072.html