如何关闭完成端口管理的被动socket连接

时间:2021-06-02 23:51:55
项目背景是一个分布式的FTP服务器
接入端A连接客户端,接出端B连接服务器
如何关闭完成端口管理的被动socket连接(其实A的出场只是打酱油,请重点关注B)

考虑到大规模的连接操作,因此接入端A和接出端B都采用了完成端口处理连接,
包括FTP的控制连接和数据连接
如何关闭完成端口管理的被动socket连接(PORT模式下如果采用阻塞式连接,会使得工作线程等待,另一端的A刚好用到完成端口,所以这里也采用了完成端口)

如何关闭完成端口管理的被动socket连接(下面这段可能有些绕,但是是重点了)
在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服务器并上传数据时的报文
如何关闭完成端口管理的被动socket连接

附图第二张是filezilla连接我的代理,再连接ftp服务器并上传数据时的报文
如何关闭完成端口管理的被动socket连接

跪求各位大神指引方向 如何关闭完成端口管理的被动socket连接

8 个解决方案

#1


没有代码,看不出什么,光对比报文,看不出什么明显错误。

#2


引用 1 楼 guanchaoyi 的回复:
没有代码,看不出什么,光对比报文,看不出什么明显错误。


代码贴上来的话太多了,而且要把整个过程描述出来的话,会比较散乱
现在我发现正常报文在建立连接的时候WS = 7, 而且会多一条报文TCP Window Update
请问如何设置才能模拟报文完全一致?

#3


顶上去,在线急等

#4


自己顶,在线等啊

#5


好牛逼的样子,顶

----<这是一个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


引用 1 楼 guanchaoyi 的回复:
没有代码,看不出什么,光对比报文,看不出什么明显错误。


代码贴上来的话太多了,而且要把整个过程描述出来的话,会比较散乱
现在我发现正常报文在建立连接的时候WS = 7, 而且会多一条报文TCP Window Update
请问如何设置才能模拟报文完全一致?

#3


顶上去,在线急等

#4


自己顶,在线等啊

#5


好牛逼的样子,顶

----<这是一个c++群>

#6


再顶一次。。。不要沉啊。。。

#7


o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了

#8


o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了