winsock函数套接字期望作为第三个参数,协议通常是套接字类型SOCK_STREAM的IPROTO_TCP和套接字类型SOCK_DGRAM的IPROTO_UDP。当我传递0值作为协议参数时,TCP和UDP按预期工作。
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0)
// s is a valid socket
IPROTO_IP协议参数值是什么意思?如果只是想与SOCK_RAW一起使用,为什么会出现这种冗余呢?
socket(AF_INET, SOCK_STREAM, IPROTO_TCP);
socket(AF_INET, SOCK_DGRAM, IPROTO_UDP);
协议参数实际指定了什么?当我可以使用另一个值时,看起来它不重要。
我想从具有多个netword卡的PC向特定的以太网段发送UDP数据包(包括广播)。虽然IP路由通常选择网卡(和源地址),但我想指定适配器并考虑原始套接字或任何其他方法来实现这一目标。在这种情况下,这个IPPROTO_IP可能会有所帮助。
答案 0 :(得分:1)
我认为socket的文档(可以在这里找到:http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx)非常清楚它的价值是什么,以及为什么如果你不在乎传递0就好了。
如果您想为不寻常的连接类型设置套接字,则可能需要传递不同内容的情况;例如蓝牙,或者如果你想创建一个PGM可靠的多播插座等等。
您的第二个问题与原始套接字或协议参数无关。您需要做的只是将您的套接字绑定到您要使用的本地接口的地址;所以,不要绑定到INADDR_ANY并允许堆栈为您决定,而是告诉它使用哪个接口。