能力值:
( LV2,RANK:10 )
2 楼
boy怎么研究起Ghost来了
能力值:
( LV3,RANK:20 )
3 楼
出错重发的确是蛋疼。。。。
能力值:
( LV2,RANK:10 )
4 楼
我还是挺佩服软件作者的,他的面向对象思想很超前,一个gh0st就有很多可以学习的地方。
能力值:
( LV3,RANK:20 )
5 楼
XXXX
能力值:
( LV2,RANK:10 )
6 楼
对,WSASend MSDN上只描述了这两种情况,我也没有碰到过返回其他值的情况,
If no error occurs and the send operation has completed immediately, this function returns zero. The overlapped structures are updated with the receive results, and the associated event is signalled 有这种想法的主要是
受制于send 函数 。
linux 下的 send 函数的Return 描述
On success, these calls return the number of characters sent. On error, -1 is returned, and errno is set appropriately windows 下的send 函数的 return 描述
If no error occurs, send returns the total number of bytes sent, which can be less than the number requested to be sent in the len parameter 不过从逻辑上讲,确实应该有可能只发送了半截数据,然后断掉,WSASend返回失败,结果对方收到了部份数据,然后导致了数据重复的情况
能力值:
( LV12,RANK:750 )
7 楼
还真没注意过这个细节!受教了
能力值:
( LV2,RANK:10 )
8 楼
tcp协议发数据就不会失败,发送方发出去,没有收到对方ACK,TCP驱动自己也会重传,如果数据变化了,接收方校验到CRC不匹配,也会重传,不需要编码实现重传的。
但是会有网络不稳定的情况,出现这边SEND一次,对面收到多次RECV的情况。TCP没有固定的包界限,需要自己分包。
能力值:
( LV2,RANK:10 )
9 楼
另外,如果你是要写个IOCP服务器,用gh0st那个IOCP还不如用boost.asio
能力值:
( LV2,RANK:10 )
10 楼
建议对IOCP特别熟悉的人,搞个C/S的实例出来让大家学习。现在网上流传的大部分都有各种缺陷
能力值:
( LV2,RANK:10 )
11 楼
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp03/chat/chat_server.cpp
发个参考代码,boost.asio的,用的reactor的设计方式,现在很多高性能服务器都是用的这种设计方式,好像是学的ACE(没看过ACE代码,那个有点大)
能力值:
( LV3,RANK:20 )
12 楼
XXXX
能力值:
( LV3,RANK:20 )
13 楼
这个其实已经是TCP协议栈要处理的问题了,应用层无须去考虑这些东西。
能力值:
( LV3,RANK:20 )
14 楼
XXXX
能力值:
( LV2,RANK:10 )
15 楼
没太懂你举这个例表达啥意思?
是想说这种情况不会发生? 我投递一个10KB的包,假如把网速相像的非常的慢。 前面5K传完了,对方也收到了,然后网络断掉了。
确实WSASend是返回失败了,但对方确实是收到重复的数据了吧?
不明白微软不允许是怎么个不允许法。他能控制对端?
能力值:
( LV3,RANK:20 )
16 楼
XXXX
能力值:
( LV2,RANK:10 )
17 楼
INVALID_SOCKET,再怎么处理也是无力回天,只有重新开一个连接。所以原来的连接是不会收到重复的数据的 这里怎么推出来对方不会收到重复数据的? 我们在不考虑复杂逻辑判断的情况下,
假如就是把一个10K的数据扔过来。服务端是不知道数据长度的,只会将收到的数据依次存储。(假如我们把服务器想的很笨,他只是依次把收到的数据存储到缓存,没有任何的逻辑)
假如先发了5K,服务器收了,保存了。 然后Socket掉了, 客户端不知道,重新又把10K全部重发了。
这样是不就导致了服务器重复了?
我主要是说这种情况,不知道有没有说清楚~~~ 这种加逻辑是可以处理掉的。 比如不是一个完整的包丢弃。
能力值:
( LV3,RANK:20 )
18 楼
XXXX
能力值:
( LV2,RANK:10 )
19 楼
当然会出现只传送部分数据的情况,WSASend其中一个参数就是返回实际传送的字节,遇到这种情况得接着传剩下的数据!
能力值:
( LV2,RANK:10 )
20 楼
。。。。。
能力值:
( LV2,RANK:10 )
21 楼
你仔细看我原话。 我说的就是服务器端不告诉 客户端 我收到了哪些数据 。
所以前一次部分成功的数据。 在返回值上并没有体现。 (发送成功了5K,但是函数返回值告诉你失败,你以为全部都是失败,所以又全部重发。) 也就是WSASend 返回失败 , 但实际上有部分字节是发送到对方了。
如果不在应用层上加控制的话。单纯的重连,再次投递,这部份就重复了。
不知道我说清楚了没有?
能力值:
( LV3,RANK:20 )
22 楼
XXXX
能力值:
( LV2,RANK:10 )
23 楼
1,这种情况肯定会发生的,我用WSASend 没出现过,可能是我代码跑的场景不是太充分,但send 确实出现过 。而且 从逻辑上讲也是可能的。
2,确实socket 关掉了,所以我要重新连接再发送啊。
下面是你的原话,我觉得是不正确的。当返回失败, 已发送字节数大于零时,就是这种情况了。
要想你这种场景应该也不难,假设是一根1k的网线, 然后我们投递了一个1000M的数据包(假如),然后去发送, 中途拔掉网线,或者杀掉服务端程序。
函数肯定返回失败,但数据只发送了部分
为什么不会出现只发送一部分的情况呢?
能力值:
( LV3,RANK:20 )
24 楼
XXXX
能力值:
( LV3,RANK:20 )
25 楼
XXXX