bug1:dll关闭之后销毁了建立的socket
client端--》创建socket在一个dll里面,然后并没有注意到代码(第三方代码,看了源码才注意到)有一个地方在按下一个按钮后调用了FreeLibrary把动态链接库给释放了,那么在动态链接库里面建立的socket同样被释放了,所以在服务端一直阻塞在了recv这个函数。
bug2:bug1之后,我们在客户端重新创建socket,服务端也重新创建socket,但是由于线程同步问题(因为我们一个线程专门接收数据,一个线程处理数据以及做其他动作),在接收线程调用recv函数之后(由于客户端还没有发送东西过来,所以阻塞在了recv)才重新创建的socket,然而这个时候recv函数还在接收以前的那个socket的数据,肯定会接收不到啊!!
我更改了一下同步的代码,建立了两个事件量(windows里面的事件对象同步),初始化的时候让接收的事件量recv_event为non_signaled,处理的事件量pro_event为signaled.然后在接收线程用WaitForSingleObject等待pro_event,处理线程里面用WaitForSingleObject等待recv_event,刚开始由于pro_event为signaled所以可以先进入接收线程,接收线程完了之后SetEvent(recv_Event),触发处理线程往下执行,处理线程执行完之后SetEvent(pro_Event),触发接收线程往下执行,这样就保证了按照我们预期执行,而且可以在处理线程重新建立socket连接之后,再触发接收线程运行recv函数,这样就解决了bug2