c***@gmail.com
2005-09-14 21:48:12 UTC
Hello,
First Thanks for all the Work on NSPR, it has saved me a lot of work,
I am having an issue with MultiCast on Windows 2000
This Code works Fine on Linux but fails with WSAEADDRNOTAVAIL in
PR_Bind on the windows side. I have Tried to research as much as
possible about WSAEADDRNOTAVAIL but am not having a lot of luck.
If anyone has any ideas as to what I'm doing Wrong...Here are some Code
Snippets (sorry if its a bit messy this has been kicked around by
several different People)
--start Snippet
int UDPTemplate::InitSendChannel(void)
{
PRInt32 result;
PRSocketOptionData SockOptData;
UDP_Send_Socket = PR_NewUDPSocket();
//set the Outbound Address
SendAddress.inet.family = PR_AF_INET;
SendAddress.inet.port = PR_htons(m_SendTo_Port);
PR_StringToNetAddr(m_SendTo_IP, &SendAddress);
//set the Multicast NIC
SockOptData.option = PR_SockOpt_McastInterface;
//PR_StringToNetAddr(m_nic,&SockOptData.value.mcast_if);
SockOptData.value.mcast_if.inet.ip = PR_htonl(PR_INADDR_ANY);
PrintError(PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel: Set Mcast NIC");
//Set the send Socket to be Reusable
SockOptData.option = PR_SockOpt_Reuseaddr;
SockOptData.value.reuse_addr = PR_TRUE;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set Reusaddr");
//Set Non Blocking
SockOptData.option = PR_SockOpt_Nonblocking;
SockOptData.value.non_blocking = PR_TRUE;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set Non Blocking");
//set the MultiCast Time to Live
SockOptData.option = PR_SockOpt_McastTimeToLive;
SockOptData.value.mcast_ttl = 120;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set MultiCast TTL");
SockOptData.option = PR_SockOpt_IpTimeToLive;
SockOptData.value.ip_ttl = 120;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData),
"Send Channel : Set IP TTL");
//join the Group
PRMcastRequest myReq;
myReq.mcaddr = SendAddress;
myReq.ifaddr.inet.ip = PR_htonl(PR_INADDR_ANY);
//PR_StringToNetAddr(m_nic,&myReq.ifaddr);
SockOptData.option = PR_SockOpt_AddMember;
SockOptData.value.add_member = myReq;
PrintError(PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Joining Group");
PrintError(PR_Bind(UDP_Send_Socket, &SendAddress), "Send Channel :
Binding to Socket");
return 0; //\todo Fix this to return meaningful info
}//end UDPTemplate::InitSendChannel(void)
int UDPTemplate::InitRecvChannel(void)
{
PRInt32 result;
PRSocketOptionData SockOptData;
UDP_Recv_Socket = PR_NewUDPSocket();
//set the Inbound Address
RecvAddress.inet.family = PR_AF_INET;
RecvAddress.inet.port = PR_htons(m_LocalRecv_Port);
PR_StringToNetAddr(m_LocalRecv_IP, &RecvAddress);
//set the Multicast NIC
SockOptData.option = PR_SockOpt_McastInterface;
//PR_StringToNetAddr(m_nic,&SockOptData.value.mcast_if );
SockOptData.value.mcast_if.inet.ip = PR_htonl(PR_INADDR_ANY);
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//Set the RECV Socket to be Reusable
SockOptData.option = PR_SockOpt_Reuseaddr;
SockOptData.value.reuse_addr = PR_TRUE;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//Set Non Blocking
SockOptData.option = PR_SockOpt_Nonblocking;
SockOptData.value.non_blocking = PR_TRUE;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//join the Group
PRMcastRequest myReq;
myReq.mcaddr = RecvAddress;
myReq.ifaddr.inet.ip = PR_htonl(PR_INADDR_ANY);
//PR_StringToNetAddr(m_nic,&myReq.ifaddr);
SockOptData.option = PR_SockOpt_AddMember;
SockOptData.value.add_member = myReq;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
result = PR_Bind(UDP_Recv_Socket, &RecvAddress);
return result;
}//end UDPTemplate::InitSendChannel(void)
--end Snippet
First Thanks for all the Work on NSPR, it has saved me a lot of work,
I am having an issue with MultiCast on Windows 2000
This Code works Fine on Linux but fails with WSAEADDRNOTAVAIL in
PR_Bind on the windows side. I have Tried to research as much as
possible about WSAEADDRNOTAVAIL but am not having a lot of luck.
If anyone has any ideas as to what I'm doing Wrong...Here are some Code
Snippets (sorry if its a bit messy this has been kicked around by
several different People)
--start Snippet
int UDPTemplate::InitSendChannel(void)
{
PRInt32 result;
PRSocketOptionData SockOptData;
UDP_Send_Socket = PR_NewUDPSocket();
//set the Outbound Address
SendAddress.inet.family = PR_AF_INET;
SendAddress.inet.port = PR_htons(m_SendTo_Port);
PR_StringToNetAddr(m_SendTo_IP, &SendAddress);
//set the Multicast NIC
SockOptData.option = PR_SockOpt_McastInterface;
//PR_StringToNetAddr(m_nic,&SockOptData.value.mcast_if);
SockOptData.value.mcast_if.inet.ip = PR_htonl(PR_INADDR_ANY);
PrintError(PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel: Set Mcast NIC");
//Set the send Socket to be Reusable
SockOptData.option = PR_SockOpt_Reuseaddr;
SockOptData.value.reuse_addr = PR_TRUE;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set Reusaddr");
//Set Non Blocking
SockOptData.option = PR_SockOpt_Nonblocking;
SockOptData.value.non_blocking = PR_TRUE;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set Non Blocking");
//set the MultiCast Time to Live
SockOptData.option = PR_SockOpt_McastTimeToLive;
SockOptData.value.mcast_ttl = 120;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Set MultiCast TTL");
SockOptData.option = PR_SockOpt_IpTimeToLive;
SockOptData.value.ip_ttl = 120;
PrintError( PR_SetSocketOption(UDP_Send_Socket, &SockOptData),
"Send Channel : Set IP TTL");
//join the Group
PRMcastRequest myReq;
myReq.mcaddr = SendAddress;
myReq.ifaddr.inet.ip = PR_htonl(PR_INADDR_ANY);
//PR_StringToNetAddr(m_nic,&myReq.ifaddr);
SockOptData.option = PR_SockOpt_AddMember;
SockOptData.value.add_member = myReq;
PrintError(PR_SetSocketOption(UDP_Send_Socket, &SockOptData), "Send
Channel : Joining Group");
PrintError(PR_Bind(UDP_Send_Socket, &SendAddress), "Send Channel :
Binding to Socket");
return 0; //\todo Fix this to return meaningful info
}//end UDPTemplate::InitSendChannel(void)
int UDPTemplate::InitRecvChannel(void)
{
PRInt32 result;
PRSocketOptionData SockOptData;
UDP_Recv_Socket = PR_NewUDPSocket();
//set the Inbound Address
RecvAddress.inet.family = PR_AF_INET;
RecvAddress.inet.port = PR_htons(m_LocalRecv_Port);
PR_StringToNetAddr(m_LocalRecv_IP, &RecvAddress);
//set the Multicast NIC
SockOptData.option = PR_SockOpt_McastInterface;
//PR_StringToNetAddr(m_nic,&SockOptData.value.mcast_if );
SockOptData.value.mcast_if.inet.ip = PR_htonl(PR_INADDR_ANY);
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//Set the RECV Socket to be Reusable
SockOptData.option = PR_SockOpt_Reuseaddr;
SockOptData.value.reuse_addr = PR_TRUE;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//Set Non Blocking
SockOptData.option = PR_SockOpt_Nonblocking;
SockOptData.value.non_blocking = PR_TRUE;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
//join the Group
PRMcastRequest myReq;
myReq.mcaddr = RecvAddress;
myReq.ifaddr.inet.ip = PR_htonl(PR_INADDR_ANY);
//PR_StringToNetAddr(m_nic,&myReq.ifaddr);
SockOptData.option = PR_SockOpt_AddMember;
SockOptData.value.add_member = myReq;
result = PR_SetSocketOption(UDP_Recv_Socket, &SockOptData);
result = PR_Bind(UDP_Recv_Socket, &RecvAddress);
return result;
}//end UDPTemplate::InitSendChannel(void)
--end Snippet