当在完成端口中.如下使用.结果会如何?谢谢

cnvvv 2004-10-21 08:58:12
当在完成端口中.如下使用.结果会如何?谢谢

比如:
WSASEND("aaa");
WSASEND("bbb");

会不会出现发出的结果合并?如:"aababb"这样的效果?

这样的操作.是不是就要等一个操作完成再作下一个操作才能不出现这样的情况?

请高手指教.谢谢

...全文
238 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
elssann 2004-10-21
  • 打赏
  • 举报
回复
回复人:cnvvv() ( ) 信誉:62 2004-10-21 11:16:00 得分:0
?
send会返回你发送的字节数.并且.这个值是<=实大小的.

就是说.不一定会一次全发出去.

那么第一个不一定会一次全发完.第二次就已经发了.这时是不是就出现“aababb”了?

---------------------------------------------------------
这种情况会出现。所以一般要吧WSASEND设置成线性的。发完第一个再发第二个
所以对于单个连接来说,IOCP并不一定比别的模型性能高多少。重要的是异步IO用
几个线程就能处理很多连接,这才是IOCP的 作用。
elssann 2004-10-21
  • 打赏
  • 举报
回复
没看清楚楼主的帖子,楼主:
1:TCP下,包的顺序不会乱。
2:TCP协议下粘包是不可避免的 ,即使设置那个什么nodelay选项。或者关闭nagel算法。
除非你在应用层控制,做到每收到一个包就应答一次然后回应。
3:IOCP其实就是一个异步IO和一个消息队列,自己都可以实现一个。还有,并不是完成端口才
是把请求转换成IRP,事实上 ,凡是涉及到和WINDOW KERNEL通信的东西,基本上都是
以IRP形式提交给KERNEL的。
cnvvv 2004-10-21
  • 打赏
  • 举报
回复
send会返回你发送的字节数.并且.这个值是<=实大小的.

就是说.不一定会一次全发出去.

那么第一个不一定会一次全发完.第二次就已经发了.这时是不是就出现“aababb”了?
  • 打赏
  • 举报
回复
怎么还在讨论???这种情况不会发生!!
你们没有弄清楚“粘包”与“混包”的区别。楼主的意思是会不会“混包”,明确地说这是不可能发生的。“粘包”指的是本来发送了两次包“aaa”“bbb”,而在接收端一次就接收完了“aaabbb”。如果接收端不能足够快地接收包,“粘包”是可能的。而“混包”是不可能的,在接收端不可能接收到“aababb”,否则,象bob640所说,去找微软算帐去。
simahuapeng 2004-10-21
  • 打赏
  • 举报
回复
感觉写windows层程序的人,真是不知有汉,无论魏晋啊,呵呵,开个玩笑,七猫前辈,握个手
cnvvv 2004-10-21
  • 打赏
  • 举报
回复
就是由于是消息列队.那那第一个WSASend没有完全发送.这时完成全处理第二个WSASend.这时第一个再接上次发送.就会把数据混起来了.不是这样吗?
bob640 2004-10-21
  • 打赏
  • 举报
回复
TCP协议是基于流的协议,能保证可靠传输,在一端收到的序列与传送一端的序列应相同.完成端口虽是异步方式,但实际经网卡流出的序列还是同步的,上面所说的这些现象是不会存在的.如果存在的话,找微软去算帐.
sevencat 2004-10-21
  • 打赏
  • 举报
回复
呵呵,不用写驱动也知道,因为完成端口部分的原代码在2K泄漏出来的原代码里。不光是NT的核心吧。
simahuapeng 2004-10-21
  • 打赏
  • 举报
回复
写过驱动的人应该对完成端口最理解,因为上层所有的请求都会转化为irp终端请求包,这是nt的核心——等我做干了就发消息告诉你!
sevencat 2004-10-21
  • 打赏
  • 举报
回复
实际上完成端口跟网络编程基本上是没啥关系的。最好不要扯在一起。
我还是觉得完成端口只是在消息到的时候自动激活线程的一个消息队列而已,不是那种神秘的东东。
simahuapeng 2004-10-21
  • 打赏
  • 举报
回复
我觉得问题不在于TCP本身,什么情况下会出现:
WSASEND("aaa");
WSASEND("bbb");
如果程序被设计成这样,这就是协议设计问题了。
现在很流行完成端口,很多帖子都在问这些问题,实际上完成端口只是一个基础框架,真正的传输协议
还是要自己去设计,看看pop3,smtp,ftp,http这些协议,还有很多开源的p2p,他们是怎么进行封包和解包的!
sevencat 2004-10-21
  • 打赏
  • 举报
回复
合并,而且即使缓冲区设为0(这样做在完成端口中不是个好主意,会LOCK住内存,有时候会使单个线程都LOCK掉,使TDI层的内存缓冲不工作)的话,接收的时候不及时接收还是会合并的。自定义边界才是解决之道。
huang_yu 2004-10-21
  • 打赏
  • 举报
回复
“如果要确保发送的数据不合并.就要等第一个发完.再来发第二个.对吗?”
这个并不是解决问题的办法,很难保证在大量用户连接的情况下不出现你说的情况,最好是把每次发送的数据封包,才是解决问题的办法。
huang_yu 2004-10-21
  • 打赏
  • 举报
回复
将发送缓冲设置为0就不会。但实际使用上决大部分可能是会合并的,应为你两次调用的时间间隔太短了,系统自动把数据放入缓冲区,等待一起发送。
DentistryDoctor 2004-10-21
  • 打赏
  • 举报
回复
就即便是合并了,接收端也会正确分离的。这是IP协议的事。
DentistryDoctor 2004-10-21
  • 打赏
  • 举报
回复
这是底层协议的事,可能底层会将其合并,将发送缓冲设置为0就不会。
  • 打赏
  • 举报
回复
估计不会吧,虽然是异步,但由于也是TCP协议,所以应该是能够保证aaa发完了才能够发bbb的。不然的话,还叫什么面向连接的,可靠的协议?
cnvvv 2004-10-21
  • 打赏
  • 举报
回复
也就是说.如果要确保发送的数据不合并.就要等第一个发完.再来发第二个.对吗?

elssann(臭屁虫和他的开心果) 谢谢你.
elssann 2004-10-21
  • 打赏
  • 举报
回复
不仅仅是完成端口,TCP协议都会如此
elssann 2004-10-21
  • 打赏
  • 举报
回复
你说的情况都存在。
加载更多回复(5)
Re:CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端口映射======================# 本章课程大纲        公网地址和私网地址        NAT应用场景        静态NAT  :static  地址转换        动态NAT  :dynamic地址转换        PAT        :端口地址转换        端口映射 :port map        在Windows上同时实现的NAT和端口映射 # 私网地址三类 A类:10.0.0.0                                255.0.0.0(1网段) B类:172.16.0.0 -172.31.0.0         255.255.0.0(16网段) C类:192.168.0.0-192.168.255.0  255.255.255.0(255网段) # NAT 的使用场景        NAT的最初的目的是允许把私有IP地址映射到公网地址,以减缓IP地址空间的消耗。        当一个组织更换它的互联网服务提供商ISP,但不想更改内网配置方案时,NAT同样很有用途。        以下是适于使用NAT的多种情况:         企业内网接入Internet节省公网地址         单向访问         大方向:内网访问互联网(互联网上主机不能够访问内网主机)         小方向:同单位实现两个网段之间单向访问(涉密部门能够访问其他部门,反之不可)         增加一个网段          避免在主干路由器增加到这个网段的路由         在Windows上实现的NAT和端口映射 # 网络地址转换的类型        下面介绍一下NAT的三种类型。         静态NAT 是为了在私网地址和公网地址间,允许一对一映射而设计的。         或者IPv4和IPv6之间的转换(典型)         不节省公网地址,故公网地址的利用效率不高,         无任何安全性,外网可以通过公网地址直接攻击内网主机,好像只增加路由器的工作         适用场景类似代理,可以较方便的更换主机,而无需修改路由器的配置         故应用不够广泛...         动态NAT 可以实现映射一个未注册 IP地址到注册IP地址池的一个注册IP地址。         多对一,或多对多         比较PAT优势:避免被误认为攻击而被封ip地址         不太节省地址,应用不广泛         复用是最流行的NAT配置类型,也被称为端口地址映射(PAT)。         通过使用PAT,可实现上千个用户仅通过一个真实的全球 IP地址连接到Internet。         缺点:增加延迟,消耗路由器性能 # 端口映射(port mapping) 允许Internet上的计算机通过企业路由器的公网IP地址访问到内网的服务器------------------------------------------------         

18,356

社区成员

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

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