如何开始使用Python SCTP堆栈(pysctp)?

2 投票
3 回答
5916 浏览
提问于 2025-04-17 08:26

我刚刚在 http://www.epx.com.br/pysctp/ 上安装了pysctp,但在运行基本示例时遇到了问题。我可能哪里做错了呢?

我使用的是Red Hat Linux系统。

Python 2.7.2 (default, Oct 25 2011, 10:11:43)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> import sctp
>>> sk = sctp.sctpsocket_tcp(socket.AF_INET)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python2.7/lib/python2.7/site-packages/sctp.py", line 1644, in __init__
    sctpsocket.__init__(self, family, TCP_STYLE, sk)
  File "/usr/local/python2.7/lib/python2.7/site-packages/sctp.py", line 1016, in __init__
    self.events = event_subscribe(self)
  File "/usr/local/python2.7/lib/python2.7/site-packages/sctp.py", line 623, in __init__
    self.__dict__.update(self.container._get_events())
  File "/usr/local/python2.7/lib/python2.7/site-packages/sctp.py", line 1356, in _get_events
    return _sctp.get_events(self._sk.fileno())
IOError: [Errno 22] Invalid argument

3 个回答

1

布莱恩说得对 - 在调用 getsockopt 函数来获取 SCTP_EVENTS 的时候,确实遇到了一些问题。我还没有找到解决办法,不过我在 sctp.py 这个文件里把这一行注释掉了:

self.__dict__.update(self.container._get_events())

这样一来,SCTP 的套接字就正常工作了。目前我还不需要获取 SCTP_EVENTS,所以这样处理也没问题。

1

看起来这是内部的一个错误。get_events这个函数会调用getsockopt

getsockopt(2)的说明是:

   EINVAL    optlen invalid in setsockopt().
2

有人把ABI搞坏了(往sctp_event_subscribe这个结构里加了几个字段,结果内核希望用户空间也能适应这些新字段)。这里有个临时解决办法,真正的解决方案应该是让内核能够接受那些用较小的struct_event_subscribe头文件编译的旧应用程序,而不让它们看到新字段……或者干脆更新到lksctp-devel里的新头文件,然后重新编译所有东西。

--- _sctp.c~    2011-12-20 16:48:45.000000000 +0200
+++ _sctp.c 2011-12-20 16:49:23.498912252 +0200
@@ -832,8 +832,9 @@
 {
    PyObject* ret = 0;
    int fd;
+   char padding[4]; // Happily overflowing here...
    struct sctp_event_subscribe v;
-   socklen_t lv = sizeof(v);
+   socklen_t lv = 10; // Come to think of it, it could have been 9 at some point

    if (PyArg_ParseTuple(args, "i", &fd)) {
        if (getsockopt(fd, SOL_SCTP, SCTP_EVENTS, &v, &lv)) {

撰写回答