Windows Api第三篇

Windows API和Socket编程

Windows API

使用win32 api写出的程序有以下优势。
1、生成的可执行体积小
2、执行效率高
3、更适合用于编写直接对系统进行底层操作的程序,其所生成的代码质量也更加高效简洁。

Socket API

所有在win32平台上的Winsock编程都要经历的步骤:
定义变量->获取Winsocket版本->加载winsocket库->初始化->创建套接字->设置套接字选项->关闭套接字->卸载winsocket库->释放所有资源

C/S模式

传统的网络通信模式是C/S模式,即客户端与服务器端。服务端先启动监听,客户端连接。

服务端Socket的操作

接下来将详细阐述Windows Sockets编程中服务端的Socket编程。服务端编程主要涉及初始化阶段调用WSAStartup函数、建立Socket、绑定和监听端口,设置接受函数,异步处理函数WSAAsyncSelect、Socket连接断开。

初始化 WSAStartup()

在使用Scoket之前必须调用WSAStartup函数。此函数是应用程序中用来初始化Windows Socket dll。只有此函数调用成功后,应用程序才可以调用dll中的其他函数,否则后面的函数都调用失败。
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData)
1、第一个参数wVersionRequested:是Windows Socket的版本号
2、第二个参数lpWSAData: 是指向WSADATA的指针,用来存储系统传回的关于Winsocket的结构。
3、返回值:执行成功返回0
调用方式:
WSAStartup(MAKEWORD(2,2),(LPWSADATA)&WSAData)

建立Socket

初始化Winsocket的动态链接库后,需要在服务器端建立一个用来监听Socket句柄。
SOCKET socket(int af,int type,int protocol)
1、第一个参数af:指应用程序使用的通讯协议的协议族,对于TCP/IP—>FF_INET
2、第二个参数type: 指定要创建的套接字类型。
3、第二个参数protocol: 指定要使用的通讯协议。
3、返回值:执行成功返回Socket对象,否则返回ICVALID_SOCKET.

绑定端口

创建了一个Socket以后,一个服务器程序必须调用bind函数来为其绑定一个IP地址和特定的端口号。这样客户端才指定连接谁
int bind(SOCKET s,const struct sockaddr FAR *name,int namelen)
1、第一个参数s:指定待绑定的Socket描述符
2、第二个参数name: 指定一个Sockaddr。
3、第二个参数namelen: 指定name结构体的大小。
这里介绍一下第二个参数name:
struct sockaddr(u_short sa_family; char sa_data[14]);
对于TCP/IP协议族的套接字进行绑定时,通常使用另一个结构体

1
2
3
4
5
6
7
8
9
struct sockaddr_in(
short sin_famil;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
);
第一个参数sin_famil:指定TCP/IP协议族类型AF_INET。
第二个参数sin_port: 指明端口号。
第二个参数sin_addr: 表示IP地址

调用的例子

1
2
3
4
5
6
struct sockaddr_in name;
name.sin_family=AF_INET;
name.sin_port=htons(80);
name.sin_addr.s_addr=htonl(INADDR_ANY);//没有ip可以填这个
int namelen=sizeof(name);
bind(sSocket,(struct sockaddr *)&name,namelen)

可以通过getsockname()函数来获知其被设定的值。

监听端口

服务器必须建立一个监听的队列来接受客户端发起的请求。
int listen(SOCKET s,int backlog)
第二个参数backlog:为一次连接的最大数目。
accept函数
SOCKET accept(SOCKET s,struct sockaddr FAR *addr,int FAR *addrlen)
WSAAsyncSelect函数
int WSAAsyncSelect()b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BOOL SetProcessShutdownParameters(
DWORD dwLevel,
DWORD dwFlags
);
参数:
dwLevel:进程关闭优先级(相对于系统中的其他进程的).系统从高级别到低级别关闭进程.最高和最低的关闭优先级保留给系统组件用,用户的参数必须是以下:
Value Meaning
000–0FF System reserved last shutdown range(系统保留最后关机范围).
1001FF Application reserved last shutdown range.
2002FF Application reserved "in between" shutdown range.
3003FF Application reserved first shutdown range.
4004FF System reserved first shutdown range.
dwFlags:系统在不为用户显示重试对话框的情况下终止该进程。
Donate
-------------本文结束感谢您的阅读-------------