联网服务器学习
Windows API
基本信息
别名Windows应用程序接口,是针对Microsoft Windows操作系统家族的系统编程接口。
函数分类
基本服务、组件服务、用户界面服务、图形多媒体服务、消息与协作、网络、Web服务。
功能
基础服务(Base Services),提供对Windows系统可用的基础数据资源的访问接口。比如像:文件系统(file system)、外部设备(device)、进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。接口位于kernel32.dll和advapi32.dll。
图形设备接口(GDI),提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。接口位于gdi32.dll。
图形化用户界面(GUI),提供功能为:创建和管理屏幕和大多数基本控件,比如按钮和滚动条。接收鼠标和键盘输入,以及其他和GUI有关的功能。接口位于comctl32.dll。
通用对话框链接库(Common Dialog BoxLibrary),为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等。接口位于comdlg32.dll。
通用控件链接库(Common Control Library),为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏、进度条、工具栏和标签。接口位于comctl32.dll。
Windows外壳(Windows Shell),作为Windows API的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。接口位于shell32.dll。
网络服务(Network Serveices),为访问操作系统提供的多种网络功能提供接口。他们包括NetBIOS、Winsock、NetDDE及RPC等。
Socket(套接字)
头文件:
#include <winsock.h>
相关函数:
函数名 | 功能 |
---|---|
accept() | 确认外来连接,并将它与一个立即建立的数据套接字联系起来。原始套接字返回到接听状态。 |
bind() | 给未命名套接字赋一个本地名。 |
closesocket() | 从进程对象参考表中删去一个套接字,只有当SO_LINGER设置时才阻塞。 |
connect() | 在指定套接字上初始化连接。 |
getpeername() | 获取与指定套接字连接的对等方的名字。 |
getsockname() | 获取指定套接字的当前名字。 |
getsockopt() | 获取与套接字相关的选项。 |
htonl() | 将一个32位数从主机字节顺序转换为网络字节顺序。 |
htons() | 将一个16位数从主机字节顺序转换为网络字节顺序。 |
inet_addr() | 将一个用网络标准点分表示法表示的字符串地址转换成网际地址值。 |
inet_ntoa() | 将一个网际地址值转化成一个用点分十进制表示法表示的字符串地址。 |
ioctlsocket() | 为套接字提供控制。 |
listen() | 在指定套接字上监听外来连接。 |
ntohl() | 将一个32位数从网络字节顺序转换为主机字节顺序。 |
ntohs() | 将一个16位数从网络字节顺序转换为主机字节顺序。 |
recv() | 从一个连接的套接字上接收数据。 |
recvfrom() | 从一个连接或未连接的套接字上接收数据。 |
select() | 执行多路同步I/O。 |
send() | 给一个连接的套接字发送数据。 |
sendto() | 给一个连接或未连接的套接字发送数据。 |
setsockopt() | 设置与指定套接字相关的选项。 |
getsockopt() | 获取与指定套接字相关的选项。 |
shutdown() | 关闭全双工连接的一部分。 |
socket() | 建立一个通讯用的末端点,返回一个套接字。 |
函数具体展示:
socket
SOCKET PASCAL FAR socket (
_In_ int af,
_In_ int type,
_In_ int protocol);
功能:创建一个套接字。
参数:
-
af:一个地址描述。仅支持AF_INET格式,也就是说ARPA Internet地址格式。
-
type:新套接字接口描述( SOCK_STREAM——TCP、 SOCK_DGRAM——UDP、SOCK_RAW ——其他)。
-
protocol:套接字所用的协议。如调用者不想指定,可用0指定,表示缺省。
返回值:没有错误发生,返回一个与建立套接字相关的描述符。否则返回INVALID_SOCKET,错误码可通过WSAGetLastError()函数得到。
ioctlsocket
int PASCAL FAR ioctlsocket (
_In_ SOCKET s,
_In_ long cmd,
_Inout_ u_long FAR *argp);
功能:控制套接口的模式。
参数:
- s:一个套接接口的描述;
- cmd:对套接口的s的操作命令;
- argp:指向cmd命令所带参数的指针。
返回值:没有错误发生,返回0。否则返回-1,错误码可通过WSAGetLastError()函数得到。
connect
int PASCAL FAR connect (
_In_ SOCKET s,
_In_reads_bytes_(namelen) const struct sockaddr FAR *name,
_In_ int namelen);
功能:在指定套接字上初始化连接。
参数:
-
s:发出连接请求的套接字的描述符;
-
name:对等方的套接字地址;
-
namelen:socket address结构的字节数.
返回值:没有错误发生,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
setsockopt
int PASCAL FAR setsockopt (
_In_ SOCKET s,
_In_ int level,
_In_ int optname,
_In_reads_bytes_opt_(optlen) const char FAR * optval,
_In_ int optlen);
功能:设置与套接字相关的选项。
参数:
- s:将要被设置或者(获取)选项的套接字;
- level:选项所在的协议层(SOL_SOCKET——通用套接字选项、IPPROTO_IP——IP选项、IPPROTO_TCP——TCP选项);
- optname:需要访问的选项名;
- optval:(获取)或者设置套接字选项,根据选项名称的数据类型进行转换;
- optlen:(对于getsocket(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。)对于setsocket(),现选项的长度。
返回值:没有错误发生,返回0。否则返回-1,错误码可通过WSAGetLastError()函数得到。
getsockopt
int PASCAL FAR getsockopt (
_In_ SOCKET s,
_In_ int level,
_In_ int optname,
_In_reads_bytes_opt_(optlen) const char FAR * optval,
_In_ int optlen);
功能:获取与套接字相关的选项。
参数:(同上)。
recv
int PASCAL FAR recv (
_In_ SOCKET s,
_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,
_In_ int len,
_In_ int flags);
功能:此函数用于在参数s指定的已连接的数据报或者套接字上读取输入数据。
参数:
- s:已连接的套接字的描述符;
- buf:指向接受输入数据缓存区的指针;
- len:buf参数所指缓冲区的长度;
- flags:指定调用的方式,它可用来与套接字相关的选项一起影响函数的功能。
返回值:没有错误发生,返回收到的字节数。如果连接错误,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
send
int PASCAL FAR send (
_In_ SOCKET s,
_In_reads_bytes_(len) const char FAR * buf,
_In_ int len,
_In_ int flags);
功能:此函数用于在参数s指定的已连接的数据报或者套接字上发送输出数据。
参数:(同上)。
返回值:没有错误发生,返回总共发送的字节数(注意:这可能比len指示的长度小)。如果连接错误,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
WSAStartup
int PASCAL FAR WSAStartup(
_In_ WORD wVersionRequired,
_Out_ LPWSADATA lpWSAData);
功能:WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令。
参数:
- wVersionRequired:一个WORD(双字节)型数值,在最高版本的Windows Socket支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号;
- lpWSAData:指的是WSADATA数据结构的指针,用来接收Windows Socket实现的细节。
返回值:没有错误发生,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
WSACleanup
int PASCAL FAR WSACleanup(void);
功能:应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
返回值:没有错误发生,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
select
int PASCAL FAR select (
_In_ int nfds,
_Inout_opt_ fd_set FAR *readfds,
_Inout_opt_ fd_set FAR *writefds,
_Inout_opt_ fd_set FAR *exceptfds,
_In_opt_ const struct timeval FAR *timeout);
功能:确定一个或多个套接口的状态,如需要则等待。
参数:
- nfds:是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!在Windows中这个参数的值无所谓,可以设置不正确。
- readfds:(可选)指针,指向一组等待可读性检查的套接口。
- writefds:(可选)指针,指向一组等待可写性检查的套接口。
- exceptfds:(可选)指针,指向一组等待错误检查的套接口。
- timeout:select()最多等待时间,对阻塞操作则为NULL。
返回值:返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误,应用程序可通过错误码可通过WSAGetLastError()函数得到。
bind
int PASCAL FAR bind (
_In_ SOCKET s,
_In_reads_bytes_(namelen) const struct sockaddr FAR *addr,
_In_ int namelen);
功能:将本地地址与套接字相连,建立半连接。
参数:
- s:指示未连接的数据报或者流套接字的描述符;
- addr:本地名字;
- namelen:地址缓存长度sizeof(socketaddr)。
返回值:没有错误发生,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
listen
int PASCAL FAR listen (
_In_ SOCKET s,
_In_ int backlog);
功能:TCP服务端监听函数。
参数:
- s:已经命名的socket(使用了bind)尚未连接;
- backlog:等待连接的队列的长度大于1小于5.
返回值:没有错误发生,返回0。否则返回SOCKET_ERROR,错误码可通过WSAGetLastError()函数得到。
accept
SOCKET PASCAL FAR accept (
_In_ SOCKET s,
_Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR *addr,
_Inout_opt_ int FAR *addrlen);
功能:服务端接收客户端请求。
参数:
- s:该套接字在accept()函数的参数前必须先调用过listen()函数,此时它正处于监听连接状态;
- addr:一个可选的指向缓存区的指针,用来接收连接的地址信息,在通讯层使用;
- addrlen:一个可选的指向整数的指针,它调用时含有地址addr指向的空间的大小,返回时含有返回的地址的确切长度(字节数)。
返回值:没有错误发生,返回一个SOCKET类型的值,表示接收到套接字的描述符。否则返回INVALID_SOCKET,错误码可通过WSAGetLastError()函数得到。