- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 网络通信器
现在,有许多即时通信软件在大家的生活中非常常见,并且起着很大的作用。即时通信软件可以让用户之间快速地进行交流沟通,也正是因为这个原因使人们对即时通信软件的需求非常大,对其功能要求也很苛刻。在本章中,将向用户介绍实现即时通信功能的软件编程方法以及通信原理。
7.1 通 信 原 理
网络通信软件的数据通信是通过网络套接字进行的。根据该原理,其编程步骤应分为创建套接字、在套接字上进行收发数据、关闭套接字等操作。在这里需要用户注意:如果在服务器端进行编程,成功创建套接字以后,需要将本地地址与端口号绑定到已经创建的套接字上。
在VC中,创建基于对话框模式的应用程序,利用资源管理器对程序界面进行整理,使界面整齐、美观。但是,限于笔者的美工水平,所设计出来的程序界面仅供用户学习和参考,笔者主要讲述程序设计方法等。如果用户对界面不够满意,可以对随书光盘中的本实例界面重新进行设计。
注意:用户在实际使用时,应该首先启动服务器,然后再启动客户端。否则,客户端将不能连接服务器。
7.1.1 通信连接
在通信软件初始化时,客户端连接服务器的过程是该应用程序初始化的第一步,也是很重要的一步。客户端利用API函数创建套接字,需要对套接字库进行初始化。代码如下:
01 ... //省略部分代码
02 WSADATA data;
03 DWORD ss=MAKEWORD(2,0);
//指定套接字库版本号
04 ::WSAStartup(ss,data); //初始化套接字库
当程序正常退出或者遇到其他情况退出时,用户应该对已经初始化的套接字库进行释放。示例代码如下:
01 ... //省略部分代码
02 WSACleanup();
//释放套接字库
1.创建套接字
用户对套接字库初始化成功后,便可以调用前面所介绍的函数创建套接字了。对于服务器和客户端而言,服务器的套接字分为连接套接字和数据收发套接字。因为作为服务器不可能只响应一个客户端的连接请求,所以创建连接套接字对所有的连接请求进行响应。下面,将分别向用户介绍创建客户端和服务器端套接字的具体方法。
(1)创建客户端套接字
对于创建客户端套接字,需要用户指定协议类型。代码如下:
01 ... //省略部分代码
02 SOCKET s; //声明套接字对象
03s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//创建套接字,并返回其句柄
(2)创建服务器套接字
与客户端创建套接字不同。首先,服务器需要创建一个专门用于响应客户端连接请求的连接套接字。然后,将该套接字与本地地址绑定在一起。最后,在该套接字上进行监听。代码如下:
01 ... //省略部分代码
02 SOCKADDR_IN addr;
03 s1=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建连接套接字对象
04 addr.sin_family=AF_INET; //填充套接字地址结构
05 addr.sin_port=htons(80);
06 addr.sin_addr.S_un.S_addr=inet_addr(strIP);
07 ::bind(s1,(sockaddr*)addr,sizeof(addr));
//绑定套接字与本地地址
08 ::listen(s,5);
//监听套接字
其中,变量strIP表示本地IP地址。
用户可以通过gethostbyname()等函数获取本地IP地址。代码如下:
01 char name[20] = ;
02 gethostname(name,20); //获得主机名字
03 hostent *p=gethostbyname(name);
04 LPSTR lpAddr = p-h_addr_list[0];
05 IN_ADDR inAddr;
06 //从lpaddr所指内存复制4个字节到inAddr中
07 memmove(inAddr,lpAddr,4);
08 //将网络字节序转化为主机字节序
09 CString ipAddress = inet_ntoa(inAddr); //获得主机IP地址
当服务器端监听到客户端的连接请求以后,可以调用函数accept()完成整个连接过程,并返回一个新的套节字。服务器收发数据都是通过这个新套接字进行的。代码如下:
01 SOCKET s1=::accept(s,NULL,NULL); //返回数据收发套接字
02 //获取连接客户端的IP
03 getpeername(s1,(SOCKADDR*)add,(int*)sizeof(add));
通过以上代码,用户可以清楚地看到
文档评论(0)