Re: Troubles with adding IPv6 support to a program
> On 12. Jun 2022, at 18:40, Chris Ross wrote: > > > Tl;dr; > I don’t know why I’m getting an EINVAL from a call to bind for a second socket > > > > > 20 years ago, I spent a lot of time adding IPv6 support to IPv4-only programs. > So I thought this (adding IPv6 support to simpleproxy[1]) would be an easy > project to pick up. I’ve gotten most of the framework in, delayed only > slightly when I learned that FreeBSD is “different” in not routing IPv4 > traffic to AF_INET6 sockets [2]. > > However, I’m getting an issue from one of my bind(2) calls that I’m not able > to figure out. I was hoping someone else had a few minutes to take a quick > look and help me find out what I’m doing wrong. > > A ~70 line relevant section of the source is at https://justpaste.it/6u3jd > > The tl;dr; of this is that I: > > * getaddrinfo(NULL, portIwant) > * for each address returned: > * create a socket > * setsockopt(SO_REUSEADDR) > * bind > * listen > > The first address I get is IPv6 localhost, and that binds and listens, then > continues to the next address. A new socket is created, setsockopt’d, but > bind for the second address (IPv4 localhost) fails with EINVAL. > > As you can see in the code shared, I have lots of debugging logs in the code, > and it looks like everything is as it should be. I’m probably just missing > Something simple, and am looking for another set of eyes. > > Thanks all. Contact me off list if you like, or on-list if it’s obvious > what I’ve done and it will help others. Can you provide the output of truss whatever_you_need_to_call_your_program which shows the socket call and the failing bind call? Best regards Michael > > - Chris > > > [1] https://github.com/vzaliva/simpleproxy > [2] inet6(4), "Interaction between IPv4/v6 sockets" >
Re: Troubles with adding IPv6 support to a program
Okay. So, anyone can feel free to look at my code at the link below, but as soon as I got desperate enough to reach out to a mailer, I found my own mistake. For the curious, inside my loop I was calling socket() with the original pointer, not the iterator. :-( So, calling socket() the same way twice despite thinking I wasn’t. Sorry for the noise. - Chris > On Jun 12, 2022, at 12:40, Chris Ross wrote: > > > Tl;dr; > I don’t know why I’m getting an EINVAL from a call to bind for a second socket > > > > > 20 years ago, I spent a lot of time adding IPv6 support to IPv4-only programs. > So I thought this (adding IPv6 support to simpleproxy[1]) would be an easy > project to pick up. I’ve gotten most of the framework in, delayed only > slightly when I learned that FreeBSD is “different” in not routing IPv4 > traffic to AF_INET6 sockets [2]. > > However, I’m getting an issue from one of my bind(2) calls that I’m not able > to figure out. I was hoping someone else had a few minutes to take a quick > look and help me find out what I’m doing wrong. > > A ~70 line relevant section of the source is at https://justpaste.it/6u3jd > > The tl;dr; of this is that I: > > * getaddrinfo(NULL, portIwant) > * for each address returned: > * create a socket > * setsockopt(SO_REUSEADDR) > * bind > * listen > > The first address I get is IPv6 localhost, and that binds and listens, then > continues to the next address. A new socket is created, setsockopt’d, but > bind for the second address (IPv4 localhost) fails with EINVAL. > > As you can see in the code shared, I have lots of debugging logs in the code, > and it looks like everything is as it should be. I’m probably just missing > Something simple, and am looking for another set of eyes. > > Thanks all. Contact me off list if you like, or on-list if it’s obvious > what I’ve done and it will help others. > > - Chris > > > [1] https://github.com/vzaliva/simpleproxy > [2] inet6(4), "Interaction between IPv4/v6 sockets" >
Troubles with adding IPv6 support to a program
Tl;dr; I don’t know why I’m getting an EINVAL from a call to bind for a second socket 20 years ago, I spent a lot of time adding IPv6 support to IPv4-only programs. So I thought this (adding IPv6 support to simpleproxy[1]) would be an easy project to pick up. I’ve gotten most of the framework in, delayed only slightly when I learned that FreeBSD is “different” in not routing IPv4 traffic to AF_INET6 sockets [2]. However, I’m getting an issue from one of my bind(2) calls that I’m not able to figure out. I was hoping someone else had a few minutes to take a quick look and help me find out what I’m doing wrong. A ~70 line relevant section of the source is at https://justpaste.it/6u3jd The tl;dr; of this is that I: * getaddrinfo(NULL, portIwant) * for each address returned: * create a socket * setsockopt(SO_REUSEADDR) * bind * listen The first address I get is IPv6 localhost, and that binds and listens, then continues to the next address. A new socket is created, setsockopt’d, but bind for the second address (IPv4 localhost) fails with EINVAL. As you can see in the code shared, I have lots of debugging logs in the code, and it looks like everything is as it should be. I’m probably just missing Something simple, and am looking for another set of eyes. Thanks all. Contact me off list if you like, or on-list if it’s obvious what I’ve done and it will help others. - Chris [1] https://github.com/vzaliva/simpleproxy [2] inet6(4), "Interaction between IPv4/v6 sockets"