VC6中recv函数异常求解
历史原因,我们在使用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。