历史原因,我们在使用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。
服务器端(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。
解决方案 »
- 高手请进关于加载DLL之后release编译报错
- 在DLL中如何导出窗体(如FROMVIEW、LISTVIEW、EDITVIEW等)及资源(如ICO、BMP、JPG等),在程序中如何调用?
- 怎样才可以画任意椭圆????????????
- 请教:线程结束的问题
- 我的问题该如何解决请您指教
- installshield中用到COM组件的话,怎么进行注册?
- C++基础问题:什么叫做名字粉碎(name mangling)?
- 刚搞完了个项目,有点闲,喜欢网络这块,想学东西,太多东西得学,可是发现不通过项目有些东西很难学好,来求点经,顺便散分。
- 在钩子函数里面可以调用哪些函数 是不是只能调用win32API 在线等
- 如何将同一窗口下的单选按纽分类??用api.
- MFC listctrl 背景透明,选中行的问题(100分求助)
- 填充web表单的问题
发送完数据后,用Sleep延时一会。
第二点:
可能是你服务端代码有问题。见意贴代码。
sleep的方法不可取吧,测试还可以,实际应用好像没人敢这么做,服务器端视HP-UX,Richard Steven先生的《UNIX网络编程》上不是说:(socket的默认属性)close之后,内核会确保所有的数据发送。而我的理解,TCP数据的发送接收时内核实现的,不应该因为我没有调用recv就会接受不到数据啊!
服务器sleep,recv确实成功的,我这个测试结果忘贴出来了
这位仁兄的“异步socket”指的是windows上的吧,
我的代码中客户端不close,服务器close,