VC6中recv函数异常求解

nihao_010004 2010-06-04 05:17:42
历史原因,我们在使用VC6给客户制作动态库

其中有一段这样的代码:
服务器端(HP-UNIX)接收到客户端(windows的动态库)发送的请求,请求大约1000字节,其中头16字节,头16字节中有一个字段是用来标识版本号的,HP-UNIX服务器端先接收16字节,校验,版本号错误的话,直接把错误码赋给一个结构后write回客户端, 然后close这个fd。(结构是我们定义的通讯结构)

现在的问题是: 服务器端的close和客户的recv不确定是谁先执行,于是出现下面的状况:
1:服务器先close,recv返回10054错误(连接已经reset)
2:客户先recv, 正常接收到我们业务的错误码

这是动态库的代码,
如果我把代码原封不动的复制出来,编译成一个控制台程序,无论1,2哪种情况,客户都会正常接收到业务错误码

但是, 根据TCP/IP的原理, 即使对方close, 但是它在close之前write了一些东西,我之后recv,也应该能接收到它write的东西啊, 为何动态库就会返回10054呢?

还有一个现象:服务器不是先接收16字节吗, 如果改为服务器检测到错误的版本号之后,继续接收完剩余的字节,无论1,2,客户端都会正常接收到业务错误码,而不是recv返回10054。

...全文
206 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihao_010004 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 eyodo8 的回复:]
你应该使用的是异步Socket吧,你可以通过查询消息,确认数据正常发送了再close
[/Quote]

这位仁兄的“异步socket”指的是windows上的吧,
我的代码中客户端不close,服务器close,
nihao_010004 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 china_ccboy 的回复:]
第一点:
发送完数据后,用Sleep延时一会。
第二点:
可能是你服务端代码有问题。见意贴代码。
[/Quote]

服务器sleep,recv确实成功的,我这个测试结果忘贴出来了
nihao_010004 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 china_ccboy 的回复:]
第一点:
发送完数据后,用Sleep延时一会。
第二点:
可能是你服务端代码有问题。见意贴代码。
[/Quote]

sleep的方法不可取吧,测试还可以,实际应用好像没人敢这么做,服务器端视HP-UX,Richard Steven先生的《UNIX网络编程》上不是说:(socket的默认属性)close之后,内核会确保所有的数据发送。而我的理解,TCP数据的发送接收时内核实现的,不应该因为我没有调用recv就会接受不到数据啊!

eyodo8 2010-06-09
  • 打赏
  • 举报
回复
你应该使用的是异步Socket吧,你可以通过查询消息,确认数据正常发送了再close
lijianli9 2010-06-07
  • 打赏
  • 举报
回复
你调用了shutdown函数了吗?
china_ccboy 2010-06-07
  • 打赏
  • 举报
回复
第一点:
发送完数据后,用Sleep延时一会。
第二点:
可能是你服务端代码有问题。见意贴代码。
CHouse10000 2010-06-07
  • 打赏
  • 举报
回复
closesocket前shutdown,服务器最好linger
nihao_010004 2010-06-05
  • 打赏
  • 举报
回复
这个问题困扰我很久了,唉
soswaidao 2010-06-04
  • 打赏
  • 举报
回复
可能是vc6本身的bug

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧