RecvDataThread()函数接收服务器发送的数据结果,并负责通知主线程显示该结果。该函数以客户端连接状态bConnecting变量为while语句循环条件。
当套结字缓冲区无数据时,recv()函数立即返回,并返回WSAEWOULDBLOCK错误代码。执行continue语句,继续调用recv()函数接收数据结果。
当套结字缓冲区有数据时,recv()函数返回读入数据的长度。在程序中增加返回值必须大于HEADERLEN长度的判断,以防止其他意外的情况。使用memcpy()函数将数据复制到接收数据缓冲区。调用SetEvent()函数设置显示数据hEventShowDataResult事件对象为有信号状态,通知主线程显示数据。
在该函数中,对前面所述客户端被动关闭的情况进行了同样的处理。
此外,客户端还有一种被动关闭的情况。主线程等待用户输入数据时,就是在InputAndOutput()函数执行到下面语句。此时,客户端与服务器的连接断开,主线程等待在这里。
cin >> cInput; //输入表达式
此时,接收数据线程的recv()函数返回值为零,说明客户端与服务器的连接端开。修改连接状态bConnecting变量值为FALSE,该线程退出。在该线程退出之前,设置显示数据结果hEventShowDataResult事件对象为有信号状态。发送数据线程在接收到这个通知后,也立即退出。

RecvDataThread函数详述了如何处理服务器发送的数据,它在客户端连接状态为while循环条件。当套接字无数据时,recv()返回WSAEWOULDBLOCK并继续尝试。接收到数据后,如果长度大于HEADERLEN,数据会被复制到缓冲区,并通过SetEvent通知主线程显示。客户端被动关闭时,如cin输入导致断开,线程会设置事件并退出,确保子线程先于主线程结束。
最低0.47元/天 解锁文章
1564

被折叠的 条评论
为什么被折叠?



