套接字网络编程

上传人:wt****50 文档编号:37836989 上传时间:2018-04-23 格式:DOCX 页数:18 大小:41.56KB
返回 下载 相关 举报
套接字网络编程_第1页
第1页 / 共18页
套接字网络编程_第2页
第2页 / 共18页
套接字网络编程_第3页
第3页 / 共18页
套接字网络编程_第4页
第4页 / 共18页
套接字网络编程_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《套接字网络编程》由会员分享,可在线阅读,更多相关《套接字网络编程(18页珍藏版)》请在金锄头文库上搜索。

1、18.3 | Windows 套接字技术套接字技术套接字(Socket)是网络通信的基本构件,最初是由加利福尼亚大学Berkeley 学院为 UNIX 开发的网络通信编程接口,它只能运行在 UNIX 操作系统,不支持 DOS 和 Windows 操作系统。随着 Windows 操作系统的日益推广,90 年代初,微软和第三方厂商共同制定了一套标准,即 Windows Socket 规范,简称WinSock。本节将介绍有关 Windows 套接字的相关技术。18.3.1 套接字概述套接字概述套接字的概念与文件句柄类似,一个套接字就是一个通信标识,由一个短整数表示,实际上就是一个句柄,代表网络协议中

2、的一组数据,该数据包含了通信双方的 IP 地址和当前的连接状态等信息。我们知道,如果一个文件被打开,可以通过文件句柄对文件进行读写操作,套接字也一样,只不过套接字提供的函数更多一些。套接字存在于通信区域中,由协议、地址、端口来描述并惟一确定,根据传输协议的不同,套接字可分为 3 种类型:流式套接字、数据报套接字和原始套接字。流式套接字提供了一个面向连接的、可靠的、数据无错且按顺序接收的服务,这种套接字对应的是面向连接的传输协议,如 TCP/IP 协议簇中的TCP。数据报套接字提供了一个无连接服务,不提供无错保证,数据可能丢失或重复,且接受顺序混乱,该套接字所对应的是无连接传输协议,如 TCP/

3、IP 协议簇中的 UDP。原始套接字允许直接访问低层的协议,如 IP、ICMP 协议,该套接字常用于访问服务器中配置的新设备。18.3.2 WinSock API 相关函数相关函数WinSock 提供了许多套接字函数,它们并不代表协议的某一个层次,其实质就是一组编程接口,用户利用这些函数可以很容易地进行编程。(1)socket 函数socket 函数用于创建一个套接字。语法:SOCKET socket (int af, int type, int protocol );af:标识一个地址家族,通常为 AF_INET。type:标识套接字类型,如果为 SOCK_STREAM,表示流式套接字;如果

4、为SOCK_DGRAM,表示数据报套接字。protocol:标识一个特殊的协议被用于这个套接字,通常为 0,表示采用默认的 TCP/IP 协议。(2)accpet 函数accpet 函数用于接受客户端的连接请求。返回值是一个新的套接字,它对应于已经接受的客户端连接,对于该客户端的所有后续操作,都应使用这个新的套接字。语法:SOCKET accept (SOCKET s,struct sockaddr FAR* addr, int FAR* addrlen);s:是一个套接字,它应处于监听状态。addr:是一个 sockaddr_in 结构指针,包含一组客户端的端口号、IP 地址等信息。addr

5、len:用于接收参数 addr 的长度。(3)bind 函数bind 函数用于将套接字绑定到一个已知的地址上。如果函数执行成功,返回值为 0,否则为 SOCKET_ERROR。语法:int bind (SOCKET s, const struct sockaddr FAR* name, int namelen );s:是一个套接字。name:是一个 sockaddr 结构指针,该结构中包含了要绑定的地址和端口号。namelen:确定 name 缓冲区的长度。在定义一个套接字后,需要调用 bind 函数为其指定本机地址、协议和端口号。例如,创建一个套接字 s,将其绑定到 3010 端口上,其代码

6、如下: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)(4)closesocket 函数closesocket 函数用于关闭某个套接字。语法:int closesocket (SOCKET s );s

7、:标识一个套接字。如果参数 s 设置有 SO_DONTLINGER 选项,则调用该函数后会立即返回,但此时如果有数据尚未传送完毕,会继续传递数据,然后才关闭套接字。(5)connect 函数connect 函数用于发送一个连接请求。如果函数执行成功,返回值为 0,否则为 SOCKET_ERROR。用户可以通过 WSAGetLastError 得到其错误描述。语法:int connect (SOCKET s,const struct sockaddr FAR* name, int namelen);s:标识一个套接字。name:套接字 s 想要连接的主机地址和端口号。namelen:name 缓

8、冲区的长度。(6)htons 函数htons 函数将一个 16 位的无符号短整型数据由主机排列方式转换为网络排列方式。语法:u_short htons (u_short hostshort );hostshort:一个主机排列方式的无符号短整型数据。(7)htonl 函数htonl 函数将一个 32 位的无符号长整型数据由主机排列方式转换为网络排列方式。语法:u_long htonl (u_long hostlong );hostlong:一个主机排列方式的无符号长整型数据。(8)inet_addr 函数inet_addr 函数将一个由字符串表示的地址转换为 32 位的无符号长整型数据。语法:

9、unsigned long inet_addr (const char FAR * cp );cp:一个表示 IP 地址的字符串。(9)listen 函数listen 函数用于将套接字置入监听模式。语法:int listen (SOCKET s, int backlog );s:套接字。backlog:表示等待连接的最大队列长度。例如,如果 backlog 被设置为3,此时有 4 个客户端同时发出连接请求,那么前 3 个客户端连接会放置在等待队列中,第 4 个客户端会得到错误信息。(10)recv 函数recv 函数用于从连接的套接字中返回数据。语法:int recv (SOCKET s, c

10、har FAR* buf, int len, int flags );recv 函数参数的说明如表 18.5 所示。表 18.5 recv 函数参数说明参 数 名 称参 数 描 述S标识一个套接字Buf是接收数据的缓冲区Len是 buf 的长度Flags表示函数的调用方式,可选值如下:MSG_PEEK_用来查看传来的数据,在序列前端的数据会被复制一份到返回缓冲区中,但是这个数据不会从序列中移走MSG_OOB_用来处理 Out-Of-Band 数据(11)select 函数select 函数用来检查一个或多个套接字是否处于可读、可写或错误状态。语法:int select (int nfds, f

11、d_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout );select 函数参数说明如表 18.6 所示。表 18.6 select 函数参数说明参 数 名 称参 数 描 述nfds没有实际意义,只是为了和 UNIX 下的套接字兼容readfds标识一组被检查可读的套接字writefds标识一组被检查可写的套接字exceptfds是被检查有错误的套接字timeout标识函数的等待时间(12)send 函数send 函数在已经建立连接的套接字上发

12、送数据。语法:int send (SOCKET s, const char FAR * buf, int len, int flags );send 函数参数说明如表 18.7 所示。表 18.7 send 函数参数说明参 数 名 称参 数 描 述s标识一个套接字buf是存放要发送数据的缓冲区len标识缓冲区长度flags标识函数的调用方式(13)WSAStartup 函数WSAStartup 函数用于初始化 WS2_32 动态库。它应该是应用程序第 1 个调用的 Windows Socket 函数,用于确定 Windows Socket 使用的版本。语法:int WSAStartup (WO

13、RD wVersionRequested, LPWSADATA lpWSAData );wVersionRequested:标识调用者使用的 Windows Socket 的版本,高字节记录修订版本,低字节记录主版本。例如,如果 Windows Socket 的版本为2.1,则高字节记录 1,低字节记录 2。lpWSAData:记录 Windows Socket 的详细信息。下面的代码用于确定 Windows Socket 使用的版本。WSADATA wsd;WSAStartup(MAKEWORD(2,2),(14)WSACleanup 函数WSACleanup 函数与 WSAStartup

14、函数是相对的,用于终止使用 WS2_32 动态库。语法:int WSACleanup (void);说明:当 Windows Socket 使用完成时,应调用 WSACleanup 函数释放分配给应用程序或动态库的资源。(15)WSAAsyncSelect 函数WSAAsyncSelect 函数用于将网络中发生的事件关联到窗口的某个消息中。语法:int WSAAsyncSelect (SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );WSAAsyncSelect 函数参数说明如表 18.8 所示。表 18.8 WSAAsyncSelec

15、t 函数参数说明参 数 名 称参 数 描 述s标识套接字hWnd标识窗口句柄wMsg标识窗口消息lEvent标识网络中的事件18.3.3 使用套接字函数设计网络聊天室使用套接字函数设计网络聊天室在 18.3.2 节中笔者介绍了常用的套接字函数,接下来将利用这些套接字函数设计一个网络聊天室程序。程序由两个实例组成,第 1 个实例为服务器端,负责接收用户的连接请求,并转发用户信息。第 2 个实例为客户端,负责连接服务器并发送信息。服务器端程序设计步骤如下:ch1806 实例位置:mr/18/sl/06(1)创建一个基于对话框的应用程序,设计对话框资源如图 18.11 所示。(2)在对话框的头文件中

16、引用“winsock2.h”头文件,并导入网络库文件。#include “winsock2.h“#pragma comment (lib,“ws2_32.lib“)(3)在应用程序的 InitInstance 方法中初始化套接字。WSADATA wsd;WSAStartup(MAKEWORD(2,2),(4)在对话框类中定义成员变量,记录服务器套接字和与之连接的客户端套接字信息。SOCKET m_server,m_client;SOCKET m_ClientsMAXNUM; /客户端套接字int m_CurClient; /当前连接的客户数量(5)在对话框类的 OnInitDialog 方法中创建套接字,并初始化数据。/创建套接字m_server = socket(AF_INET,SOCK_STREAM,0);/将网络中的事件关联到窗口的消息函数中WSAAsyncSelect(m_server,m_hWnd,20000,FD_WRITE|FD_READ|FD_ACCEPT);m_client = 0;m_serverIP = “;for (int i = 0; i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号