2

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
4

3 に答える 3

2

誰かが ABI を壊しました (struct 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)) {
于 2011-12-20T14:56:04.653 に答える
1

内部のバグのようpysctpです。 get_eventsを呼び出しますgetsockopt

getsockopt(2)言います:

   EINVAL    optlen invalid in setsockopt().
于 2011-12-15T18:10:34.677 に答える
1

getsockoptBrian の言うとおりです。SCTP_EVENTSを呼び出すには、ある種の問題があります。私はそれを解決できませんでしたが、sctp.py の次の行をコメントアウトしました。

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

その後、SCTP ソケットは正常に動作しているようです。SCTP_EVENTS を取得する必要はまだないので、今のところこれで問題ありません。

于 2011-12-16T12:33:31.770 に答える