visualc++网络编程案例实战之socket套接字编程

上传人:101****457 文档编号:117187860 上传时间:2019-11-18 格式:PPTX 页数:105 大小:3.93MB
返回 下载 相关 举报
visualc++网络编程案例实战之socket套接字编程_第1页
第1页 / 共105页
visualc++网络编程案例实战之socket套接字编程_第2页
第2页 / 共105页
visualc++网络编程案例实战之socket套接字编程_第3页
第3页 / 共105页
visualc++网络编程案例实战之socket套接字编程_第4页
第4页 / 共105页
visualc++网络编程案例实战之socket套接字编程_第5页
第5页 / 共105页
点击查看更多>>
资源描述

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

1、第2章 Socket套接字编程 套接字是由美国伯克利大学提出并设计的一种 在网络中不同主机之间进行数据交换的通信桥 梁。在实际生活中,人们所使用的网络通信软 件功能均是基于Socket套接字作为通信桥梁实 现。所以,套接字在网络编程中,有着非常重 要的作用。本章将向用户介绍使用Socket套接 字编程的相关概念以及实现方法。 2.1 寻址方式和字节顺序 在讲解套接字编程前,用户需要首先了解一下 什么是寻址方式和字节顺序。在Socket套接字 编程中,为了准确定位通信双方和数据传输的 有效性、完整性,编程时必须使用统一的寻址 方式和字节排列顺序。 2.1.1 寻址方式 因为套接字需要在各种网络协

2、议中使用,所以 为了区分程序所使用的网络协议必须使用统一 的寻址方式。例如,在TCP/IP协议通信中,用 户使用IP地址和端口号进行确定通信双方。而 在其他的协议中不一定也使用该方式确定通信 双方。 在Winsock(Socket API)中,用户可以使用 TCP/IP地址家族中统一的套接字地址结构解决 TCP/IP寻址中可能出现的问题。 该套接字地址结构定义如下: struct sockaddr_in short sin_family;/指定地址家族即地址格式 unsigned short sin_port;/端口号码 struct in_addr sin_addr;/IP地址 char s

3、in_zero8;/需要指定为0 ; 在这个结构中,成员sin_family指定使用该套 接字地址的地址家族。在这里必须设置为 AF_INET,表示程序所使用的地址家族是 TCP/IP。 注意:该结构的最后一个成员并未实际使用 ,主要是为了与第一个版本的套接字地址结构 大小相同而设置。在实际使用时,将这8个字 节直接设为0即可。 该结构成员变量sin_addr表示32位的IP地址结构。其结构定义如下: struct in_addr union struct unsigned char s_b1, s_b2,s_b3,s_b4; S_un_b;/用4个u_char字符描述IP地址 struct

4、unsigned short s_w1,s_w2; S_un_w;/用2个u_short类型描述IP地址 unsigned long S_addr;/用1个u_long类型描述IP地址 S_un; ; 通常,用户在网络编程中使用1个u_long类型的字 符进行描述IP地址即可。例如,使用IP地址结构 in_addr 进行描述IP地址“218.6.132.5”。代码如下 : sockaddr_in addr; addr.sin_addr.S_un.S_addr=inet_addr(“218.6.132.5“) ; 在程序中,首先定义sockaddr_in结构对象addr, 然后为IP地址结构in

5、_addr中的成员S_addr赋值。 因为结构成员S_addr所描述的IP地址均为网络字 节顺序,所以程序调用inet_addr()函数将字符串IP 转换为以网络字节顺序排列的IP地址。 2.1.2 字节顺序 在Socket套接字编程中,传输数据的排列顺序 以网络字节顺序和主机字节顺序为主。通常情 况下,如果用户将数据通过网络发送时,需要 将数据转换成以网络字节顺序排列,否则可能 造成数据损坏。如果用户是将网络中接收到的 数据存储在本地计算机上,那么需要将数据转 换成以主机字节顺序排列。从数据存储的角度 来讲,网络字节顺序即将数据中最重要的字节 首先进行存储,而主机字节顺序则将不重要的 字节首

6、先存储。 注意:IP地址结构in_addr中的成员S_addr的 值均是以网络字节顺序排列。 1字节顺序转换函数 在Winsock中提供了几个关于网络字节顺序与主机字节顺序之间的转换 函数。函数定义如下: /将一个u_short类型的IP地址从主机字节顺序转换到网络字节顺序 u_short htons (u_short hostshort ); /将一个u_long类型的IP地址从主机字节顺序转换到网络字节顺序 u_long htonl (u_long hostlong ); /将一个u_long类型的IP地址从网络字节顺序转换到主机字节顺序 u_long ntohl (u_long netl

7、ong ); /将一个u_short类型的IP地址从网络字节顺序转换到主机字节顺序 u_short ntohs (u_short netshort ); /将一个字符串IP转换到以网络字节顺序排列的IP地址 unsigned long inet_addr (const char FAR * cp); /将一个以网络字节顺序排列的IP地址转换为一个字符串IP char FAR * inet_ntoa (struct in_addr in); 以上函数的使用均与操作系统平台无关。因此,用户使用这些函数编写 的程序能在所有操作系统平台中运行。 2实例程序 在本节中,将编写实例程序向用户讲解字节顺 序

8、转换函数的用法。代码如下: . /省略部分代码 sockaddr_in addr;/定义套接字地址结构变量 addr.sin_family=AF_INET;/指定地址家族为TCP/IP addr.sin_port=htons(80);/指定端口号 /将字符串IP转换为网络字节顺序排列的IP addr.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1“); /将网络字节顺序排列的IP转换为字符串IP char addres=inet_ntoa(addr.sin_addr.S_un.S_addr); 在程序中,用户首先使用函数inet_addr()将字 符串IP“

9、127.0.0.1”转换为以网络字节顺序排列 的IP并保存在IP地址结构成员S_addr中。然后 ,再使用函数inet_ntoa()则将该成员所表示的 IP值转换成字符串IP。 2.1.3 Socket相关函数 由于Windows网络程序开发均是基于Windows 套接字实现,所以本节将重点介绍MFC中的 CSocket类以及使用CSocket类编程的基本流 程。 1创建套接字 使用CSocket类创建套接字对象是通过该类的构造函数创建 的。其原型如下: CSocket:CSocket( ); 例如,用户创建CSocket类对象,代码如下: CSocket sock; 如果用户需要创建套接字对

10、象指针,则应该使用关键字 new进行创建。代码如下: CSocket *sock;/定义套接字指针对象 sock=new CSocket;/使用new关键字创建套接字 2绑定地址信息 如果用户创建服务器套接字,那么用户应该调用 该类的函数Bind()将套接字对象与服务器地址信 息绑定在一起。其原型如下: BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 该函数的作用是将套接字对象与服务器地址结构 绑定在一起。如果函数调用成功,则返回true。否 则,返回false。参数lpSockAddr指定将要绑定的 服务器地址结构,参数

11、nSockAddrLen表示地址结 构的长度。 例如,用户将上面创建的套接字对象与地址结构绑定。代码如下 : CSocket sock; /创建套接字对象 sockaddr_in addr; /定义套接字地址结构变量 addr.sin_family=AF_INET; /指定地址家族为TCP/IP addr.sin_port=htons(80); /指定端口号 /将字符串IP转换为网络字节顺序排列的IP addr.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1“); sock.Bind(SOCKADDR*)addr,sizeof(addr); /绑定套接字与地

12、址结构 . /省略部分代码 在服务器端,当地址信息绑定套接字成功后, 还需要调用函数Listen()在指定端口监听客户 端的连接请求。函数Listen()的原型如下: BOOL Listen( int nConnectionBacklog = 5 ); 参数nConnectionBacklog表示套接字监听客户 端请求的最大数目。该参数的有效范围是15 。默认为5,表示该套接字只能监听5个客户端 所发送的连接请求。 例如,套接字监听5个客户端的连接请求,代码如下: CSocket sock; /创建套接字对象 sockaddr_in addr; /定义套接字地址结构变量 addr.sin_fa

13、mily=AF_INET; /指定地址家族为TCP/IP addr.sin_port=htons(80); /指定端口号 /将字符串IP转换为网络字节顺序排列的IP addr.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1“); sock.Bind(SOCKADDR*)addr,sizeof(addr); /绑定套接字与地址结构 sock.Listen(5); /监听端口 3连接服务器 客户端创建套接字成功以后,可以调用函数 Connect()向服务器发送连接请求。函数原型如 下: BOOL Connect( const SOCKADDR* lpSockAd

14、dr, int nSockAddrLen ); 该函数调用成功,则返回true。否则,将返回 false。参数lpSockAddr表示将连接的服务器地 址结构。参数nSockAddrLen表示地址结构的 长度大小。 例如,服务器IP地址为“127.0.0.1”,端口为80,客户端连接服务 器,代码如下: CSocket sock; /创建套接字对象 sockaddr_in addr; /定义套接字地址结构变量 addr.sin_family=AF_INET; /指定地址家族为TCP/IP addr.sin_port=htons(80); /指定端口号 /将字符串IP转换为网络字节顺序排列的IP

15、 addr.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1“); sock.Connect(SOCKADDR*)addr,sizeof(addr); /连接服务器 4数据交换 无论是服务器,还是客户端都是通过函数Send() 和Receive()进行数据交换。函数原型如下: virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 ); virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 ); 其中,函数Send()用于发送指定缓冲区的数据, 函数Receive()用于接收对方发送的数据,并将数 据存放在指定缓冲区中。参数lpBuf表示数据缓冲 区地址。参数nBufLen表示数据缓冲区的大小。参 数nFlags表示数据发送或接收的标志,一般情况 下,该参数均设置为0。 例如,使用这两个函数进行数据的发送和接收。 代码如下: . /省略部分代码 char

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

当前位置:首页 > 大杂烩/其它

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