Windows网络编程实验报告
局域网聊天室
学 院: 数学与计算机学院
课程名称: TCP/IP原理与实现
班 级: 网络082班
学 号: 0804511081
组 长: 田 洪 涛
小组成员: 赵明涛、陈星宇、郭 韬
徐 健、程 吉、平远、邹寒
指导教师: 胡 鸣
日 期: 2011年6月7日
一.实验目的
通过Windows网络编程,编写一个聊天工具实现聊天室的功能,用户进入聊天室就能进行通信。
二.实验原理
计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《TCP/IP协议与网络编程》这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的局域网聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要实现多人聊天功能:程序通过广播来实现局域网内部的通信,当局域网内用户运行了此程序(处于在线状态),就相当于登陆了聊天室,与广播255.255.255.255进行连接,并绑定端口8888,当客户发送一个消息时相当于向广播发送一个数据包,广播就接受此消息的数据包,然后广播就向在线的每个用户发送此数据包,从而实现了多人的聊天功能。广播就相当于一个转发站,进行消息的转发。整个程序的主体使用了CSocket类的方法,用UDP协议实现数据包发送、接收,实现了局域网内所有聊天。
三.实验内容
本聊天程序实现工具为Visual C++ 6.0 MFC,主要利用其中用于网络编程的CSocket类实现网络通讯功能。
( 1 ) 当客户运行此程序,就与广播255.255.255.255进行连接,并绑定端口8888,代码如下:
连接广播:
BOOL bBroadcast = TRUE;
::setsockopt(
m_socket,
SOL_SOCKET,
SO_BROADCAST,
(char*)&bBroadcast,
sizeof(BOOL));
绑定端口:
m_addrLocal.sin_family = AF_INET;
m_addrLocal.sin_addr.s_addr = INADDR_ANY;
m_addrLocal.sin_port = ::ntohs(8888);
::bind(m_socket, (sockaddr*)&m_addrLocal, sizeof(SOCKADDR));
本程序是通过UDP协议实现通信功能:
在初始化窗口时,创建UDP套接字:m_socket = ::socket(
AF_INET,
SOCK_DGRAM,
0);
( 2 ) 用户进行聊天,发送的信息相当于向广播发送数据(主要代码如下):
::sendto(
m_socket,
m_strData,
m_strData.GetLength(),
0,
(sockaddr*)&addBroadcast,
sizeof(SOCKADDR));
( 3 ) 广播接收数据报后,再向在线的各个用户发送此数据报;
( 4 ) 定义了一个套接字处理消息:afx_msg LRESULT OnWinsock();用户通过响应此消息接收数据报,并在自己机器上显示内容(主要代码):
实现接收数据报:
::recvfrom(
m_socket,
buf,
256,
0,
(sockaddr*)&addrRemote,
&nLen);
在对话框中显示信息:
CTime timeNow = CTime::GetCurrentTime();
//将时间格式化成(小时:分钟:秒)
CString strTime = timeNow.Format(" (%H:%M:%S)");
m_strLog += inet_ntoa(addrRemote.sin_addr);
m_strLog += strTime;
m_strLog += "\\r\\n";
m_strLog += buf;
m_strLog += "\\r\\n";
UpdateData(FALSE);
( 5 ) 在显示消息框中,当自己发送消息时,直接在自己电脑里显示在消息框中,没必要通过广播,但是,广播会转发数据报给每个用户,包括自己,此时在自己的机器上就不需要再次显示此内容了。
1.显示自己发送的内容(通过按钮事件完成,代码如下):
CTime timeNow = CTime::GetCurrentTime();
//将时间格式化成(小时:分钟:秒)
CString strTime = timeNow.Format(" (%H:%M:%S)");
m_strLog += "自己";
m_strLog += strTime;
m_strLog += "\\r\\n";
m_strLog += m_strData;
m_strLog += "\\r\\n";
m_strData="";
UpdateData(FALSE);
2.广播转发后就不需要再次显示显示本机发送的信息(实现代码如下):
查找发送数据地址是否为本机的:
for(int i=0;;i++)
{
if(pHost->h_addr_list[i] == NULL)
{
break;
}
if(((in_addr*)pHost->h_addr_list[i])->S_un.S_addr ==
addrRemote.sin_addr.S_un.S_addr)
{
return 0;
}
}
如果接收的数据报是本机的则就不在对话框中显示信息,否则就显示其他用户发来的信息;
四.试验测试
软件完成后,小组人员进行测试多人聊天的功能(如下):
A用户发送消息“请问你谁下午有空出去玩?”的前后:
发送前:
发送后:
此时,其他三个用户B、C、D接收到来自A的消息:
B用户:
C用户:
D用户:
A、B、C、D之间能进行通信,说明局域网内的用户能成功的进行通信,即实验达到预期的结果。
五.实验总结
我是本组的组长,主要任务是构建实现此软件的框架,设计实现它的原理以及分配给小组成员任务,整体地将他们地代码统一一下,调试、修改,一一实现功能。
此软件自身还存在的问题如下:
1. 没有添加昵称控件,而是直接用ip来识别不同客户发送的聊天信息,在聊天过程中可能会造成一些混乱;
2. 不能在同一台机器上运行多个此程序进行通信;
3. 程序界面做的比较简单,缺少层次性的美感;
4. 实现的功能比较单一,不够强大。
此程序的功能达到了之前预想的可能,实现了多用户之间的群聊,完整了一个简单的局域网内聊天软件的功能。虽然此程序的功能比较的简单,而且很多方面还没能完善,但是,通过此次的实验,也同时让我们对于CSocket网络聊天类的使用有了更深入的了解,在关于网络编程的方面也有了新的认识。下载本文