aiocoap icon indicating copy to clipboard operation
aiocoap copied to clipboard

Specifiy the network interface on windows

Open sibertdeclercq opened this issue 2 years ago • 1 comments

I'm trying to use aiocoap as a CoAP client on windows. I'm trying to make requests over IPv6, which fails presumable because I cannot figure out how to tell aiocoap which network interface it should be using.

I've tried using aiocoap-client: aiocoap-client -m GET coap://[fe80::21c:e2ff:fe00:3ce2]/info which eventually times out

I can get it to work on Linux (WSL) by appending %eth1 to the address: aiocoap-client -m GET coap://[fe80::21c:e2ff:fe00:3ce2%eth1 ]/info but this obviously doesn't work on windows.

Is this functionality supported for windows somehow?

Enviroment:

Python version: 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)]
aiocoap version: 0.4.7
Modules missing for subsystems:
    dtls: missing DTLSSocket
    oscore: missing cbor2, cryptography, filelock, ge25519
    linkheader: everything there
    prettyprint: missing cbor2, termcolor, pygments
Python platform: win32
Default server transports:  tcpserver:tcpclient:tlsserver:tlsclient:simple6:simplesocketserver
Selected server transports: tcpserver:tcpclient:tlsserver:tlsclient:simple6:simplesocketserver
Default client transports:  tcpclient:tlsclient:simple6
Selected client transports: tcpclient:tlsclient:simple6
SO_REUSEPORT available (default, selected): False, False

sibertdeclercq avatar Dec 22 '23 09:12 sibertdeclercq

I have little usable knowledge of how Windows does interface selection; I just vaguely remember that Windows is using numeric interface identifiers (so maybe it's just a topic of doing [fe80::...%1] or some other small value).

I'm happy to fix anything that works on normal UDP sockets -- can you open a regular socket in Python to that host with any arguments?

chrysn avatar Jan 17 '24 14:01 chrysn

An address beginning with fe80:: is a link-local address. This will work only if applied on the correct interface - both on Windows and Linux. You should have an IPv6 capable router in your network, which either provides you global unicast addresses (usually delegated from your internet provider) or a unique local address (ULA) which you can define yourself (in your router). If your network is configured properly, then any OS, including Windows, will route the request to the correct interface. Background information on IPv6 address types: https://www.ripe.net/media/documents/ipv6_reference_card.pdf

a-w avatar Mar 04 '24 10:03 a-w

I eventually found the solution.

aiocoap-client -m GET coap://[fe80::21c:e2ff:fe00:3ce2%<interface number>]/info

In contrast to WSL/Linux, the value after the % should be the interface number, not the interface name. The interface number can be found in ipconfig

sibertdeclercq avatar Mar 04 '24 10:03 sibertdeclercq