1

したがって、この python ライブラリhttps://github.com/chrysn/aiocoapを使用して CoaP リソースに接続しようとしています。ライブラリはpython 3.4を使用しており、3.4をインストールして、これで使用するインタープリターとして設定しています(Windows 7で使用しています)。clientGET.py ファイルを実行すると、まだこのエラー メッセージが表示されます。サーバーファイルも同様です。

C:\Python34\python.exe C:/Learning/PyCoap/aiocoap/clientGET.py
Traceback (most recent call last):
  File "C:/Learning/PyCoap/aiocoap/clientGET.py", line 34, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "C:\Python34\lib\asyncio\base_events.py", line 268, in run_until_complete
    return future.result()
  File "C:\Python34\lib\asyncio\futures.py", line 277, in result
    raise self._exception
  File "C:\Python34\lib\asyncio\tasks.py", line 236, in _step
    result = next(coro)
  File "C:/Learning/PyCoap/aiocoap/clientGET.py", line 20, in main
    protocol = yield from Context.create_client_context()
  File "C:\Learning\PyCoap\aiocoap\aiocoap\protocol.py", line 510, in create_client_context
    transport, protocol = yield from loop.create_datagram_endpoint(protofact, family=socket.AF_INET6)
  File "C:\Python34\lib\asyncio\base_events.py", line 675, in create_datagram_endpoint
    waiter)
  File "C:\Python34\lib\asyncio\selector_events.py", line 68, in _make_datagram_transport
    address, waiter, extra)
  File "C:\Python34\lib\asyncio\selector_events.py", line 911, in __init__
    super().__init__(loop, sock, protocol, extra)
  File "C:\Python34\lib\asyncio\selector_events.py", line 452, in __init__
    self._extra['sockname'] = sock.getsockname()
OSError: [WinError 10022] Ein ungultiges Argument wurde angegeben

Process finished with exit code 1
4

2 に答える 2

1

Python 3.4 が手元にある Windows マシンを持っていないため、実際の Python でこれを調査しませんでしたが、これは asyncio のバグである可能性があるようです。その UDP ソケットの作成は、おそらく Windows では機能しません。下位レベルで実験を行い、何が行われているかを調べaiocoapて、私が間違っていることを証明してみてください。

動作するはずですが、ドキュメントProactorEventLoopではUDPをサポートしていないとしか言​​及されていません。

エラー状態については、Socket.error: 無効な引数が指定されました で説明されています。

aiocoap.protocol.Context.create_client_context()asyncioドキュメントによると正しいことをしているようですが、パケットが送信される前_SelectorTransport.__init__()に常に呼び出さsock.getsockname()れ、その時点でソケットはアドレスにバインドされず (リンクされた SO の質問によると)、getsockname()Windows では失敗します。

于 2015-07-20T08:51:50.120 に答える