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

蛋丁叮叮当 2013-07-22 01:59:56
项目背景是一个分布式的FTP服务器
接入端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服务器并上传数据时的报文


跪求各位大神指引方向
...全文
417 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
许扬 2015-06-05
  • 打赏
  • 举报
回复
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了
许扬 2015-06-05
  • 打赏
  • 举报
回复
o(︶︿︶)o 唉 我也是这个问题,调试了三四天,不过终于给我找出来了,也晒晒,帮助后面的遇到这种情况的孩纸吧。没有收到[FIN,ACK]这个应答是因为设置了setsockopt里面的linger选项,强制关闭了socket所以就出现 [RST,ACK].linger设置默认就好了
蛋丁叮叮当 2013-07-22
  • 打赏
  • 举报
回复
自己顶,在线等啊
蛋丁叮叮当 2013-07-22
  • 打赏
  • 举报
回复
顶上去,在线急等
蛋丁叮叮当 2013-07-22
  • 打赏
  • 举报
回复
引用 1 楼 guanchaoyi 的回复:
没有代码,看不出什么,光对比报文,看不出什么明显错误。
代码贴上来的话太多了,而且要把整个过程描述出来的话,会比较散乱 现在我发现正常报文在建立连接的时候WS = 7, 而且会多一条报文TCP Window Update 请问如何设置才能模拟报文完全一致?
关工 2013-07-22
  • 打赏
  • 举报
回复
没有代码,看不出什么,光对比报文,看不出什么明显错误。
蛋丁叮叮当 2013-07-22
  • 打赏
  • 举报
回复
再顶一次。。。不要沉啊。。。
flyking_ 2013-07-22
  • 打赏
  • 举报
回复
好牛逼的样子,顶 ----<这是一个c++群>

18,356

社区成员

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

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