| |
 | Posted by Evan Davis | Permalink Reply |
|
Evan Davis 
| Hello,
I've been working on using std.socket to do multicast programming with d. So far I have converted c code into d code to obtain the following, but I am still getting errors.
The code is as follows (windows only):
InternetAddress localAddress = new InternetAddress(port);
InternetAddress multicastGroupAddr = new InternetAddress(multicastGroupIP, port);
ip_mreq addRequest;
sockaddr_in local_sockaddr_in = cast(sockaddr_in)(*localAddress.name);
sockaddr_in multi_sockaddr_in = cast(sockaddr_in)(*multicastGroupAddr.name);
addRequest.imr_multiaddr = multi_sockaddr_in.sin_addr;
addRequest.imr_interface = local_sockaddr_in.sin_addr;
auto optionValue = (cast(char*)&addRequest)[0.. ip_mreq.sizeof];
socket.setOption(SocketOptionLevel.IP, cast(SocketOption)IP_ADD_MEMBERSHIP, optionValue);
Note that I had to import IP_ADD_MEMBERSHIP, and import sockaddr_in. This code gives me the error "Unable to set socket option: An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call."
If I first bind the UdpSocket that is passed in, I instead get the error "Unable to bind socket: The requested address is not valid in its context."
I see suggestions to link to wsock32.lib in c++ forums rather than ws2_32.lib, but socket.d seems to link both? Any help diagnosing is appreciated.
-Evan Davis
|