recv java_recv()返回0

我有一个非常讨厌的问题,我在其他论坛上发现了几次,但我找不到合适的解决方案 . 问题是recv()在连接的最后几个字节上返回0 . 以下是一些背景信息 .

两个(客户端/服务器)应用程序在同一台计算机上运行 .

两个(客户端/服务器)套接字都是非阻塞的

传输的数据大小为53个字节 .

两个(客户端/服务器)在执行最后一个send()/ recv()时调用shutdown和closesocket .

我也尝试过SO_LINGER 10秒钟,也没有成功

我调用send()几次(小块),从客户端调用53个字节 . 服务器多次调用recv()(4字节请求)并读取49个字节然后返回0(54字节 - 49字节,因此缺少4个字节) .

MSDN和一些论坛写的非阻塞套接字:

recv()在出错时肯定返回<0并且设置了errno / WSAGetLastError

当另一方关闭连接时,

recv()肯定返回= 0

recv()在读取数据时肯定返回> 0

MSDN还说:

使用带有SD_SEND或SD_BOTH的closesocket或shutdown功能会导致在控制通道上发送RELEASE信号 . 由于ATM使用单独的信号和数据信道,RELEASE信号有可能在最后一个数据到达目的地之前到达远端,导致数据丢失 . 一种可能的解决方案是在发送的最后一个数据和ATM套接字的关闭或关闭函数调用之间编程足够的延迟 .

但仍然没有成功,在收到49字节后,我仍然在10%的连接中得到一些中断,90%的连接成功 . 有任何想法吗?谢谢 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值