2010-07-02 42 views
1

winsock函数套接字期望作为协议的第三个参数,对于套接字类型SOCK_STREAM,通常是IPROTO_TCP,对于套接字类型SOCK_DGRAM,IPROTO_UDP通常是IPROTO_TCP。当我传递0值作为协议参数时,TCP和UDP按预期工作。winsock套接字函数中的协议参数是什么?

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); 

实际上协议参数指定了什么?当我可以使用另一个值时,它看起来不重要。

我想从带有多个网络卡的PC发送UDP数据包(包括广播)到特定的以太网段。虽然IP路由通常选择网卡(和源地址),但我想指定适配器并考虑原始套接字或任何其他方式来实现此目标。在这种情况下,IPPROTO_IP可能会有所帮助。

回答

1

我认为socket的文档(可以在这里找到:http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx)很清楚它的价值是什么以及为什么如果你不关心传递0是很好的。

如果您想为不常见的连接类型设置套接字,您可能想要传递不同的情况:如蓝牙,或者如果你想创建一个PGM可靠的多播套接字等。

你的第二个问题与原始套接字或协议参数无关。你需要做的只是将你的套接字绑定到你想要使用的本地接口的地址;所以不要绑定到INADDR_ANY并允许栈决定你,而是告诉它使用哪个接口。