代码之家  ›  专栏  ›  技术社区  ›  Charles

Python的ftplib破坏发送的文件-Winsock问题?

  •  0
  • Charles  · 技术社区  · 7 年前

    我们有一个Python应用程序,用于在PC上的SVN签出和 IBM i

    Wireshark 显示数据使电脑出现故障。

    有时效果很好,有时一行或两行出现故障,有时很多行。

    在这个问题出现之前,脚本没有改变。

    storlines() Python代码中的调用:

    connection.storlines('STOR ' + ibmi_file, open(source_file.fullpath, 'rb'))
    

    其他开发人员也看到了这个问题,他们运行各种版本的Python和Windows。

    我下载了3.6.1源代码,并在socketmodule.c中的sock\u sendall()和sock\usend\u impl()中添加了一些调试日志

    我可以看到以下内容是从sock\u send\u impl()发送的。

    来源
    行#-长度(字节)

    2 - 73
    3 - 38
    4 - 73

    6 - 41



    2 - 1452

    2, 5, 3, 4

    据我所知,sock\u send\u impl()是将数据传递给操作系统的地方。我意识到 Nagle's algorithm

    但是,该数据包中的数据应该与传入send的顺序相同。事实并非如此。

    我认为这可能与最近的一些Windows补丁有关,只是我们的一个使用Mac的开发者看到了相同的(?)问题

    这对我来说没有任何意义,我也不知道接下来该怎么办。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Charles    7 年前

    我相信这个问题已经报告给了赛门铁克。

    ftplib.FTP 类并添加新函数:

    #stortext combines block read from STORBINARY with ASCII transfer mode from STORLINE
    def stortext(self, cmd, fp, blocksize=8192, callback=None, rest=None):
        self.voidcmd('TYPE A')
        conn = self.transfercmd(cmd, rest)
        while 1:
            buf = fp.read(blocksize)
            if not buf: break
            conn.sendall(buf)
            if callback: callback(buf)
        conn.close()
        return self.voidresp()
    

    storline

    所以我们继续使用我们的新功能。