首页
社区
课程
招聘
[讨论]网络编程,关于WSASend,send一次没有将数据发完的问题
发表于: 2008-10-2 03:02 9184

[讨论]网络编程,关于WSASend,send一次没有将数据发完的问题

2008-10-2 03:02
9184
编程一个网络程序,无论是用send还是WSASend,都有可能让你的发送缓冲区占满,
如果调用一次send(WSASend),发送1024字节的数据包,而由于缓冲区没有这么大的空间,所以就只发送了1000字节数据,
遇到这种情况怎么处理?有以下两种处理方法
1.再次调用send,剩下和24字节发送出去
2.重复发送1024字节数据包,直到1024字节一次性发送成功为至

对于第一种方法,由于第一次发送了1000字节数据,再次调用send(WSASend)发送24字节数据,那么,在服务端收到的是一个包,还是两个包?

一般情况下,如果说我要编程一个聊天程序,与QQ相似的,那么,每个包是独立的,
我是否应该选用第二第方法?

对于send函数,在一次性没有完全发送的问题上,我存在一些疑惑,请高手们解答一下,3ks

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
以前匿名管道通信中我好像是用第二种方法...
2008-10-2 11:04
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
都有可能,还有可能是分成N次接收。比如客户端第一次接收到的是999,第二次是25,这都有可能的,这是由当前连接的网络状况决定的。你可以到GOOGLE搜索一下“MTU是什么”以决定最佳数据包大小。或者你可以使用UDP来发送就能一次接收,但这种发送方式并不可靠。如果要用在互联网,以你的情况只能是使用TCP。



只能使用第一种方法。如果一条数据包的大小有10240字节呢,再碰上一方网络慢的话,就算你发一万次也未必会成功的。
解决方法:网络程序数据包内容一般要经过编码的,不会直接发送原始内容(不便于处理),编码后你可以分别在头尾置上一些特定的不会在编码中出现的字符作为起始和结束标记。比如以某些网络游戏为例,以#为数据包开始标记,以!为结束标记,像以下内容就是两个数据包:
#ALKDJSLKD827982398!#28928328384984!
接收到一个数据包后,你可以从中判断,将已接收完整的数据包按顺序处理完毕,然后把剩下的半个数据包,与下一次接收的数据包拼接,然后再处理,如此循环。所以不要想偷懒,看起来似乎是有点烦琐,但这事是一劳永逸的,你只要写好代码了,以后再有类似的程序,就不用重复劳做了。

我讲的比较通俗,希望你能够理解。
2008-10-3 04:24
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
谢谢了,有你的指教太好了
2008-10-3 10:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
TCP/IP协议为你数据传输提供了可靠保证,不管你一次发多少字节,到了TCP层,他都会对你的数据进行编号重组,然后发送验证双向确认,所以对于数据流而言,你一次发多少字节无所谓,关键是你的程序要对你的数据进行正确的处理。

QQ发包是通过UDP,没有研究过QQ,但是感觉,QQ也不会一次允许你发送太大的数据。因为他对它发送的大数据也应该会有一个类似于TCP得组包过程,太大了,影响性能,这是QQ软件自己实现的。

在你的程序当中,如果需要数据比较大,可以分批发送,然后接收后重新组包,或者你直接调高你的发送缓冲区大小,把组包工作交给底层驱动自己去实现,你只要识别你自己完整的数据包即可。

借此宝地,请教一个问题,因为我还不能发帖。

请问:

有谁知道卡巴,诺顿等防火墙软件的端口监控原理吗?
我安装lsp之后,只要防火墙开启80端口监控,IE就无法正常显示数据。
有谁知道该怎么解决吗?
2008-10-3 11:08
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
道卡巴,诺顿等防火墙软件的端口监控原理,应该是NDIS hook
2008-10-4 16:37
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
你这问,我没遇到过,应该说,不会有这样的问题,
2008-10-4 16:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼上的,我确实碰到这个问题无法解决。我安装了我的LSP,不打开卡巴的端口流量监控,上网浏览等一切正常,一旦打开防火墙的端口流量监控,其他的网络软件只要用到被监控的端口就无法正常工作了。找不到LSP代码哪里有错误。百思不得其解。
2008-10-4 23:52
0
游客
登录 | 注册 方可回帖
返回
//