vc下用socket api来做client,connect上server后,单独开一个线程recv(Sleep(time)或用select)。
现在的问题是,如果我在其他地方掉用了一个send(比如一个按钮事件),那么除非调用send的函数返回(应该说是可能调用send的最原始的函数,因为往往要经过若干调用才会调用使用send的函数),接收进程的recv才能返回,实际这时候server早就已经返回数据回来了(调试可以看到)。我怎么才能在send函数返回前,也就是说只要server一返回数据,recv就可以返回而不用等send函数结束?
我认为是进程独占socket句柄造成的,我用非阻塞方式也不行,那么应该怎么做呢?另外就是socket句柄我用的是全局变量。

解决方案 »

  1.   

    要么使用异步IO,或者多线程;连接成功后就调用recv;
    socket是全双工的send和recv不会相互影响
      

  2.   

    用select来侦测数据是否受到。
      

  3.   

    是这样的,收线程始终是存在的,除非发现网络断掉,只要连接上就会一直循环接收。
    而发数据是需要一些触发的,比如按钮,菜单等,不是一直发送的,这样的话,收和发本来就不在一起的啊?我也知道socket是全双工的,但是怎么我这样做就不行呢?
    应该怎么弄呢?
      

  4.   

    服务器端确实是收到client的数据才会发送,但是它的数据也确实已经返回来了,但是recv却不返回啊
      

  5.   

    点按钮如果是马上就发出去,发完就结束按钮消息函数的话也没有问题的,但是如果按钮消息或菜单函数是一个长时间的循环或着我就直接在里面Sleep(一段时间),那么除非函数结束,否则接收那里都不会返回。我现在把recv跟send放一起了,这样虽然不怎么舒服,但也凑和能用,下次再写socket不用api了。