假设存在现在这种情形,客户端刚发送给服务端一个请求,马上又跟着发一个请求(非预期),而此时由于服务端正在反馈上一个应答给客户端,这样,双方都在发送,都没有进行接收,于是乎双方都阻塞了,谁也发不动,如果有一方不主动喀嚓掉的话,就被挂在这里,请问大侠们,如果处理这个现象,设置SO_SNDTIMEO?我试了一下怎么没有响应?我服务端用完成端口重叠I/O,客户端事件选择异步socket

解决方案 »

  1.   

    来人,把XXX绑出去,砍了!
    饶命啊,不是我的错,csdn上没有人理我。。
    也罢,先寄下你项上人头
    救命啊
      

  2.   

    客户端事件选择异步socket为什么会阻塞呢?
    异步模式应该会读完才对啊。如果异步发送会eat read event,那你要考虑先读上一次的response再发送新的请求
      

  3.   

    异步的socket不会阻塞!使用线程效果会更好!
      

  4.   

    tcp/ip是全双工的,不可能出现你这种情况!全双工的意思就是发送不会影响接收,接收也不会影响发送,两者可以同时进行你考虑的太多了!
      

  5.   

    不用考虑这个。要考虑那么try catch return吧。
    客户端发送时计时。超时说明服务器没接退出
      

  6.   

    想的多了,client只要send、receive来回循环用就行啊。server只要接收到一个连接,就开一个线程来与client通信,然后主线程继续阻塞等待。
      

  7.   

    我打算这样处理,服务端设置超时控制,发送超时控制,按照套接字选项SO_SNDTIMEO的说法,用wsasocket加重叠标志创建的套接字可以设定这个选项,然后到此时间未完成,那么就认为失败,但我试了一下,发现不灵,msdn说SO_SNDTIMEO是毫秒整数值,如是我只好自己控制超时。
    列位有什么更好的建议
      

  8.   

    每次send完成后,接着来一次recv,而不等待fd_read event
      

  9.   

    我覺得你這問題問得有點奇怪啊,據我所知send是不會阻塞的吧,他只不過是把數據推到發送緩沖區,並不會等接收端的返回狀態的啊,就算要等也只是tcp這一層的事,並不會阻著你不讓你干下面的事吧.上面masterz大俠說的方法,那才會阻住呢,如果你用select模型在一個線程里處理>1個套接字,剛好你又是用的阻塞模式的socket,用上面的方法,就會出現你說的情況.個人見解,可以去試試,我剛剛試了一下.好象是這麼回事
      

  10.   

    我一般是用select模型,一般只判斷fd_read,收到數據分析后如果要發回複的內容,不等待fd_write直接send.從沒出現樓主你說的阻住這種情況
      

  11.   

    哦,问题是对方没有收,发送缓冲区已经满了啊,因为发不过去了,这时还想往缓冲区里放东西肯定不能马上完成了。还有你发送数据的时候不等待fd_write,估计局域网上不会有问题,带宽有限的情况下就难讲了
      

  12.   

    重叠io也一样,因为最终调用wsarecv必须有,并不是说采用重叠io或完成端口就可以自动完成数据接收