UDT C++库的Python包装器

5 投票
2 回答
3068 浏览
提问于 2025-04-17 00:29

我想在Python中使用UDT库,所以我需要一个封装器。我找到了这个:pyudt,但是我不太清楚怎么用它来进行点对点文件传输。有没有人能给我一些指引?

2 个回答

1

你可以试试我的这个udt_py分支。里面现在有一个示例文件recvfile.py,可以从udt的app目录里的sendfile服务中获取文件。

2

经过这么长时间,我终于找到了这个问题和它的解决方案:

安装pyudt-0.1a的步骤如下:

  • 首先,你需要安装: libboost-python1.46-dev或者相应的版本 (比如在linux-ubuntu12.04上,它在软件库里可以找到)。

  • 接下来,下载udt.h文件(可以从:http://sourceforge.net/projects/udt/)并放到系统目录中,

或者
(把udt.h文件放在和pyudt-0.1a文件同一个文件夹里,然后修改“pyudt.cpp”中的一行代码,从:

#include <udt.h>

改成:

#include "udt.h"

).

  • 在“setup.py”中更新boost_python库的版本,改成你正在使用的版本,

例如:

    ... libraries=['udt', 'boost_python-py27'])
  • 在“pyudt.cpp”中修改以下行:

必须修正一个错误,改成:

int r = UDT::send(_sock, data.c_str(), data.length(), 0);

改成:

int r = UDT::send(_sock, data.c_str(), data.length()+1, 0);

因为字符“\0”表示字符串的结束,也必须被发送,否则会在你的字符串后面加上垃圾数据。

你可以选择以下两种方式之一:

   _sock = UDT::socket(AF_INET, SOCK_DGRAM, 0);   --» default

或者:

   _sock = UDT::socket(AF_INET, SOCK_STREAM, 0);  --» optional
  • 最后,在相应的文件夹中运行,

在对应的文件夹里:

python2.7 ./setup.py build
sudo python2.7 ./setup.py install

或者,如果你没有管理员权限无法为所有用户安装,只想为自己试试:

python2.7 ./setup.py build
python2.7 ./setup.py install --prefix=~/pyudt-0.1a/installation_dir/  #in this case, pyudt would only work if called from that directory

)

然后,一个简单的客户端代码可以是:

import pyudt
socket = pyudt.pyudt_socket()
socket.connect(("127.0.0.1", 7000))
socket.send("hello_world!")

它可以正常工作,能和我的cpp服务器通信!

注意:如果你需要更多帮助,可以在python的控制台中输入:

import pyudt
dir(pyudt.pyudt_socket) # to list the available functions
help(pyudt)             # to get more help

附注:通过这个安装教程创建的文件是: /usr/local/lib/python2.7/dist-packages/pyudt.so,以及/usr/local/lib/python2.7/dist-packages/pyudt-0.1a.egg-info

撰写回答