我在网上看到
这是发送、接收函数的原型
int send( SOCKET s,  const char FAR *buf,  int len,   int flags ); 
int recv( SOCKET s,  char FAR *buf,   int len,  int flags  );   看到网上说
send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里
recv函数仅仅是copy数据,真正的接收数据是协议来完成的
这两句话我明白,就是SOCKET对象底层维护着一个接收和发送的缓存。在发送和接收的时候,都是对这个缓存操作的。现在我的问题是。如果服务器A 的 recv正在等待对方的数据堵塞在那里。对方客户A 的send已经把他要发送的数据copy到了他的缓冲区里,这时,突然对方关掉了SOCKET那么复制进客户A的发送缓存中的数据是否还会发送到我这边?我这边是接收到完整的数据。还是返回服务器A 的recv函数返回SOCKET_ERROR?请高手指点

解决方案 »

  1.   

    等A的发送缓冲区满了,就会SOCKET_ERROR。
      

  2.   

    你看看TCP/IP协议就好了
    socket就是对它的实现
      

  3.   

    异步的话当然会发出去 只是没被接收 同步的话没被接收 会等待 直到超时 最后返回error
      

  4.   

    同步异步应该没啥区别吧。现在就算是异步的话。写进缓存。那SOCKET突然断掉。有没有可能收不到情况?
      

  5.   

    已经在发送路上的会发送完毕,还在缓冲区没有发送出去的数据不会发送,因为这时socket会收到对方关闭的通知包,socket的send就会返回0了!
    如果对方是非法关闭,比如是断电等,则这边的socket收不到对方的关闭通知包,则这边的socket的send的会一直会阻塞在哪里,直到超时,否则会永远的阻塞住了、
      

  6.   

    比如说对方直接send()非阻塞的。。然后突然closesocket()..我这边是不是就有可能收不到他的数据了?
      

  7.   

    socket一断,服务器端recv()就返回-1了,再发什么应该都收不到了吧