none
对方关闭socket以后,收取残余数据的问题 RRS feed

  • 问题

  • 两个程序,A和B,用阻塞模式的socket通信。

    现在A向B发送了一些数据,send函数返回发送成功,然后A用closesocket关闭了连接。

    此时,数据已经到达了B的缓存中,B可以随时用recv接收这些数据,直到把所有数据收完,recv才会回返0。

    但现有一个问题就是:如果B在调用recv之前先调用了send,则send会仍然返回成功,但如果再调用recv,则会返回10053的错误。也就是说,在这种情况下,缓存中未接收的残余数据已经丢失。

    请问有什么办法可以保证数据不丢失?

    2016年10月12日 10:44

全部回复

  • Hi 罗穆峰,

    感谢在MSDN论坛发帖。

    >>如果B在调用recv之前先调用了send,则send会仍然返回成功,但如果再调用recv,则会返回10053的错误。也就是说,在这种情况下,缓存中未接收的残余数据已经丢失。

    请问有什么办法可以保证数据不丢失?

    错误10053指的是连接中断错误,可能是由于数据传输超时或者协议错误导致。

    建议你在使用recv函数的时候,使用MSG_WAITALL标志。

    另外,根据recv文档说明,对于connectionless sockets, recv会从目的地址读取第一个数据报文。

    对于connection oriented socket,如果远程连接关闭,并且所有的数据都已接收,则recv会以零字节接收状态立刻返回。

    详情参考以下文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

    Best Regards,
    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    2016年10月13日 3:04
  • 可能我没说清楚。请看代码 :

    以下为A程序的代码:

    	//接受连接后,立即发送数据,然后立即断开连接
    	sock=accept(...);
    	send(sock,"byebye",6,0);
    	closesocket(sock);
    

    以下为B程序的代码:

    	connect(sock, ... );
    	Sleep(3000);//连接成功后延时3秒,此时对方已对闭连接
    	if(ToSend)send(sock,"hello",5,0);
    	int n=recv(sock,buf,sizeof buf,0);
    	printf("recv返回%d,错误码=%d\n",n,WSAGetLastError());	
    

    现在问题在于ToSend这个bool值:

    如果ToSend为false,则B程序可以正常收到A程序发送"byebye"字符串;

    如果ToSend为true,则B程序无法收到任何内容。

    请问如何修改上述代码,使得B程序始终可以收到该字符串?

    2016年10月13日 4:59
  • 没有人回复吗?
    2016年10月17日 4:56
  • 通信完成之前不要关闭socket

    新浪微博http://weibo.com/xianglitian,欢迎围观

    2016年10月19日 2:57
  • >>如果ToSend为false,则B程序可以正常收到A程序发送"byebye"字符串;

    如果ToSend为true,则B程序无法收到任何内容。

    请问如何修改上述代码,使得B程序始终可以收到该字符串?

    请不要尝试这种方式。根据这篇文档,在调用Send方法时,会阻塞Winsock调用。Winsock可能需要等待网络事件才能完成调用。 Winsock在这种情况下执行可警告等待,可以由在同一线程上调度的异步过程调用(APC)中断。 在APC中发出另一个阻塞Winsock调用,中断在同一个线程上正在进行的阻塞Winsock调用将导致未定义的行为。

    详细内容参考以下文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年10月27日 8:49