CSocket多线程的几个问题
用CSocket来写的Server端和Client端程序。Server和Client都是多线程(UI线程)。
Server端在界面输入将有几个Client会连入Server,就启动几个UI线程。UI程序是继承CWinThread的。在UI线程中启动侦听,每个UI线程侦听的端口号是不一样的。每一个UI线程负责一个客户端数据的收发。
Client端运行后在执行与服务器连接时先启动一个UI线程,在UI线程中创建socket与服务器进行连接,socket收发数据也都是在UI线程中执行。
一个Client在与服务器建立链接后,Server程序中负责该Client的UI线程就不停地向Client发送BMP数据(一组25个BMP,一个BMP22K)。Server每次发送20K,在Server端进行数据拼接,每组一次都发满20K(最后一个可能没有20K)Server每Send一次Sleep(10)。在Client解包、校验数据,数据正确将一组BMP数据放入接收缓冲区中,校验不通过请求Server重发这组中接收错误的数据。Client有一个工作者线程将缓冲区中的数据写文件,写完一组从缓冲区中删除已写的数据。
Client接收数据的缓冲区用CRITICAL_SECTION进行保护。
Client每收完一组数据向Server发一个请求下一组数据的消息,Server才开始发下一组数据。
Client在开始接收数据时将负责Socket的UI线程的优先级提高到THREAD_PRIORITY_HIGHEST,Server端数据发送结束再将线程优先级降低到THREAD_PRIORITY_NORMAL。
Server和Client都是用CSocket的SetSockOpt函数将收发缓冲区都设置成25K。
问题如下:
1。一个Server对一个Client,Client接收到的数据很多都校验不通过,通过调试在CMySocket(继承CSocket)中的OnReceive中线Sleep(1),再执行Receive接收Server端发来的数据,校验全部通过。这是为什么?
2。一个Server对一个Client,Client启动保存文件线程,Client收了600多组数据后就不收,socket没有死,关闭Server,Client的OnClose相应。是什么原因照成Client不收数据?(保存文件线程使用默认优先级)
3。一个Server对一个Client,Client不启动保存文件线程,Client在收完一组数据校验完后就将数据清除掉(不写入接收数据缓冲区),Server和Client运行稳定。当一个Server对两个Client是,只有一个Client能正常运行,另一个Client只是在收了七八十组数据后就不接收数据了。socket没有死,关闭Server,两个Client的OnClose都有相应。是什么原因造成其中一个Client不收数据了呢?
4。CSocket的SetSockOpt函数设置收发缓冲区对socket有什么影响?延时需要设置吗?应该怎样正确设置?
望高人解答!