接入端A连接客户端,接出端B连接服务器
(其实A的出场只是打酱油,请重点关注B)
考虑到大规模的连接操作,因此接入端A和接出端B都采用了完成端口处理连接,
包括FTP的控制连接和数据连接
(PORT模式下如果采用阻塞式连接,会使得工作线程等待,另一端的A刚好用到完成端口,所以这里也采用了完成端口)
(下面这段可能有些绕,但是是重点了)
在FTP的PORT模式下,需要ftp服务器主动连接接出端B
现在的问题是:
在上传文件时,首先由服务器主动建立连接至接出端B,
在接出端B传输完数据之后,需要由B关闭该数据链接
B在代码里进行的操作是
cancelio
shutdown
closesocket
这个时候我希望得到的是fin的四次握手,但是得到的却是我本地发送的一个[RST,ACK]操作
随即FTP服务器报出426 Connection closed; transfer aborted. Error #10053(本地程序放弃了一个已建立的连接)
数据内容已经上传到了服务器,但是由于报出了错误,因此服务器没有返回正确应答码226,导致上传过程失败,正确的情况应该是B正常关闭数据连接并且由ftp服务器返回226表示正确
PS:
1. 正常情况下,由FTP客户端,通过Listen,accept操作建立起来的数据连接,直接closesocket没有问题
2. 在用完成端口处理时,我首先wsasocket分配了一个可进行重叠操作的socket,并侦听和绑定,再绑定至完成端口,投递accept事件,在收到accept事件通知后,将接受到的socket返回并进行管理;关闭时依次关闭listen的socket和接受的socket
3. 这种情况只出现在上传文件时,下载文件时虽然也是PORT模式(也就是服务器主动连接我的接出端),但是是服务器主动关闭连接,并无错误, 因此怀疑是完成端口这边处理被动连接时操作不当导致
4. 我怀疑过这边的数据没有发送完毕,所以测试时在关闭连接之前sleep了一秒,但是还是出现同样的情况,一个华丽丽的RST
附图第一张是正常情况下用filezilla连接ftp服务器并上传数据时的报文
附图第二张是filezilla连接我的代理,再连接ftp服务器并上传数据时的报文
跪求各位大神指引方向
8 个解决方案
#1
没有代码,看不出什么,光对比报文,看不出什么明显错误。
#2
代码贴上来的话太多了,而且要把整个过程描述出来的话,会比较散乱
现在我发现正常报文在建立连接的时候WS = 7, 而且会多一条报文TCP Window Update
请问如何设置才能模拟报文完全一致?
#3
顶上去,在线急等
#4
自己顶,在线等啊
#5
好牛逼的样子,顶
----<这是一个c++群>
----<这是一个c++群>
#6
再顶一次。。。不要沉啊。。。
#7
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了
#8
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了
#1
没有代码,看不出什么,光对比报文,看不出什么明显错误。
#2
代码贴上来的话太多了,而且要把整个过程描述出来的话,会比较散乱
现在我发现正常报文在建立连接的时候WS = 7, 而且会多一条报文TCP Window Update
请问如何设置才能模拟报文完全一致?
#3
顶上去,在线急等
#4
自己顶,在线等啊
#5
好牛逼的样子,顶
----<这是一个c++群>
----<这是一个c++群>
#6
再顶一次。。。不要沉啊。。。
#7
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了
#8
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了