视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
局域网聊天简单示例
2025-10-02 14:58:05 责编:小OO
文档


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网络聊天类的使用有了更深入的了解,在关于网络编程的方面也有了新的认识。下载本文

显示全文
专题