MFC基于对话框框架的简易飞鸽系统(一)

该程序实现的功能:

1.程序能够找到局域网内运行同样程序的所有主机,并将主机名和主机IP列出。

2.本机程序能够对其他主机进行文本信息的单发和群发。

3.本机程序能够实现对其他主机文件的单发


功能1实现过程:

    // 接收广播消息,并将本机主机名和IP发还过去

    在初始化主窗口界面时,启动一个线程,在该线程内创建一个UDP套接字,将其设为广播类型,这样该套接字就能接发广播信息。

    当该套接字接收到一条广播广播消息,并且该消息是要获取主机名和IP地址的命令后,就将本机的主机名和IP地址发还过去。

    //主动发送广播消息以获取局域网运行同样程序的主机名和IP地址

    在主窗口上添加一个按钮"刷新",给该按钮添加一个点击事件,当点击该按钮时,就启动一个线程。

    在该线程内创建一个UDP套接字,将其设为广播类型,然后该套接字发送一条广播消息"GetIPAddr",如果别的主机接受到了该消息就将自己的主机名和IP发还过来。

    发送完广播消息后,就是通过一个while循环来接受别的主机发过来的主机名和IP地址,并将信息显示到主窗口上。然后让该线程在100ms后结束,这样做的目的就是为了让获取了其他主机名和IP地址后,释放掉线程中的资源。(不过根据实际结果来看好像并不能真正释放掉该线程占用的资源,不过并不影响程序功能)

功能2实现过程(收发文本信息采用的是UDP,收发文件采用的是TCP):

    //接收其他主机发送的普通UDP信息

    在主窗口中我们能够看到获取的所有主机名和主机IP,让后选中其中一个,打开与其对话的对话窗口,打开对话窗口时将想要进行对话的主机名和IP传递给对话窗口。

    在初始化对话窗口时,启动一个线程,该线程用来接收其他主机发送过来的普通UDP信息,然后将接收到的信息显示到聊天记录中。

    //向其他主机发送普通UDP信息

    发送普通UDP信息就是获取编辑框内的内容,然后通过UDP套接字将其发送过去即可。

    //群发消息

    群发消息和发送普通消息差不多,前面打开与某一主机对话窗口时,主窗口会将其主机名和IP传递过去,然后根据这个IP发送信息。

    所以打开群发消息窗口时,主窗口就将获取的所有主机名和IP都传递给群发消息窗口,然后当点击发送按钮发送消息时,通过一个for循环,将消息一一发送给所有的IP即可。

功能3实现过程(收发文本信息采用的是UDP,收发文件采用的是TCP):

    //发送文件方

    发送文件按钮在对话窗口中,当你点击"发送文件"按钮时,弹出一个选择文件的对话窗口,该窗口是一个自带的类就是CFileDialog,当你选中了一个文件点击打开按钮后,就可以获取该文件的路径名,文件名等信息。

    当获取了要发送的文件的文件路径和文件名后,通过UDP将信息以一定格式发送过去,如"发送文件方IP:文件名"。同时启动一个线程,在该线程内创建一个TCP套接字,设为TCP服务端,等待接收文件方的连接,当接收文件连接了TCP服务端后,TCP服务端就将选中的文件发送过去。文件发送完毕后关闭TCP套接字,子线程结束。

    // 接收文件方

    接收文件方接收到一条UDP信息后,判断其格式是否为"IP:文件名",如果不是那么说明只是一条普通的聊天消息,将其显示到聊天记录中。

    如果是的话,就提示接收文件方是否接收文件,如果点击接收按钮,就会启动一个接收文件的子线程。

    在该子线程内创建一个TCP客户端,连接发送文件方的TCP服务端,当连接上服务端后,就可以接收服务端发送的文件了。接收完文件后关闭TCP套接字,子线程结束。

本程序尚未解决的问题:

1.发送方和接收方必须都打开与彼此的对话窗口才能接收到对方发来的消息。在接收方没有打开与发送方对方窗口的情况下,如果发送方发送了消息过来,接收方是没有任何提示的,即使接收方打开了与发送方的对话窗口,那么之前发送的信息还是看不到。

2.只能同时与一个主机进行通信,就是说如果你正在与A收发信息的话,你必须先关闭与A的对话窗口才能与B进行收发信息操作。

3.就是前面提到的,当你点击“刷新”按钮启动一个线程在收发UDP广播消息之后不能释放掉该线程占用的资源。因为在该线程中绑定了端口,所以如果前一次点击"刷新"按钮之后没有释放掉占用的资源的话,你这一又点击"刷新"按钮启动一个线程,绑定同一个端口,就会出现端口占用的情况。但是不知道为什么即使会有端口占用的情况,仍然不影响整个程序功能。。。

下面就是将这3个功能一一实现的过程了。

    整个工程源码:https://gitee.com/MarhongBaLa/simple_ip_system_based_on_mfc.git

   

你可能感兴趣的:(MFC)