background image

         上面的框图中中间的 UDPServer 线程等待的事件完成是 MainServer 线程在 Listen 函数
调用结束后设置的事件。这里忘了标了。

说明

         前几天在实验室看《Windows 网络与通信程序设计》这本书,看完了前 5 章吧,就觉得
目前手头的技术去做一个局域网聊天软件应该差不多了。虽然还有很多细节性的东西还不是
非常懂,但是做一个小规模的软件,我自认为是问题不大的。就这样,在大约

4 天之后,也

就是这个月的

18 号,这款 LANChat 程序诞生~

         首先我声明:因为我第一次写网络相关的程序,所以肯定存在疏忽,在相关方面肯定
是存在不少

bug 的,另外我在测试的时候也经常遇到程序启动失败的情况,而且原因尚未

查明。所以我并不保证这款程序的稳定性和安全性。(作为这个程序的设计人员真是感到汗

~以后会好的)

   另外代码中大部分析构函数形同虚设,毕竟最初实现的时候尚不清楚能够实现与其
功能,所以根本就没顾忌资源释放这一块。比如,聊天窗口建立这一块我就没使用

delete。

   多线程部分因为涉及到对数据的访问问题,所以我使用了关键段:

CriticalSection 结

构以及相关函数。

   因为这个文档是在寝室写的,所以没有在线设备,也无法打开聊天窗口,在实验室
三台计算机之间使用没问题。

   另外

winsock2 初始化是在工程中选择的,在如 console 类的程序中使用 socket 程序

前一定要做好相关的初始化以及库,文件包含工作。

   

socket 使用程序初次尝试。

 

程序实现基本思想

         首先用 UDP 广播通知在线设备,在本地 IP 对应的位置有设备上线。局域网内的在线设
备收到

UDP 广播消息后,首先会做的事情是,获取目标的 IP 地址,然后初始化一个

sockaddr 结构,向其发送 TCP 连接请求。

         刚上线的设备此时会已经做好接受准备(这里使用的事件线程同步),在 TCP 连接请
求建立后,会将其加入到

IOCP 中,并且为其投递一个数据接受的消息。之后任何到来的消

息都会由

IOCP 的线程函数专门进行处理,十分的方便。而 IOCP 线程函数是通过调用

GetQueueCompletionStatues 函数将线程添加到 IOCP 的线程池中的。

         这样任何一台刚上限的设备都能够找到局域网内的其他在线设备并与其简历 TCP 链接,