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协议族的套接字进行绑定时,通常使用另一个结构体
调用的例子
可以通过getsockname()函数来获知其被设定的值。
监听端口
服务器必须建立一个监听的队列来接受客户端发起的请求。int listen(SOCKET s,int backlog)
第二个参数backlog:为一次连接的最大数目。
accept函数SOCKET accept(SOCKET s,struct sockaddr FAR *addr,int FAR *addrlen)
WSAAsyncSelect函数int WSAAsyncSelect()b
|
|