我刚刚从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
答案 0 :(得分:2)
有人打破了ABI(添加了几个字段来构造sctp_event_subscribe,内核希望用户空间想要新的数量)。这是一个kludge,适当的修复将是内核接受已经针对具有较小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)) {
答案 1 :(得分:1)
看起来像pysctp
内部的错误。 get_events
致电getsockopt
。
getsockopt(2)
说:
EINVAL optlen invalid in setsockopt().
答案 2 :(得分:1)
Brian是对的 - 为SCTP_EVENTS调用getsockopt
会出现某种问题。我无法解决这个问题,但我已经在sctp.py中注释掉了这一行:
self.__dict__.update(self.container._get_events())
SCTP套接字似乎工作正常。我还不需要得到SCTP_EVENTS,所以现在这很好。