服务器程序<---------->我的程序<-------------->客户程序
我的程序用完成端口实现,当客户机与我的程序连接时,我的程序与服务器连接,在执行了几次WSASend和WSARecv后,我的程序被死锁了,在查看数据包后知道服务器正在发送数据,客户机正在等待数据,我应该怎么改我的程序?
数据发送示意
客户机Client 我的程序My 服务器 Server
WSARecv(客户机Socket)
WSASend(服务器Socket)
WSARecv(服务器Socket)
WSASend(客户机Socket)
WSARecv(客户机Socket)
WSASend(服务器Socket)
WSARecv(服务器Socket)
WSASend(客户机Socket)
WSARecv(客户机Socket)问题在这里了
这里的客户机其实还在等待数据接收,服务器也还在发送数据,在这里就把我的程序锁死了。我应当怎么改?

解决方案 »

  1.   

    用debug模式运行程序,等到死锁的时候点一下暂停按钮可以看到死锁的代码行。
      

  2.   

    http://community.csdn.net/Expert/topic/3403/3403660.xml?temp=.8361475
      

  3.   

    ......
    WSARecv(服务器Socket)
    WSASend(客户机Socket)
    WSARecv(客户机Socket)问题在这里了=========================在倒数第2行"WSASend(客户机Socket)"时并没有发完的所有的数据,剩下的数据要等待下一个“WSARecv(服务器Socket);WSASend(客户机Socket);”才能发完,结果客户机就继续等待剩余的数据,然后你的程序就死锁了也就是说你的程序的工作协议不对,与服务器/客户端的工作协议不一致------其实你的程序结构有问题,不应该按“先从服务器接收,转发给客户端,再从客户端接收,转发给服务器,依次循环”这样的顺序思想,而应该使用“同时监视服务器/客户端的数据到达情况,如果收到数据,若是从服务器接收的则发送给客户端,若是从客户端接收的则发送给服务器”这样的思路。