代码之家  ›  专栏  ›  技术社区  ›  harper

winsock的socket函数中的协议参数是什么?

  •  1
  • harper  · 技术社区  · 15 年前

    winsock函数socket期望第三个参数是协议,对于socket类型SOCK\u STREAM通常是IPROTO\u TCP,对于socket类型SOCK\u DGRAM通常是IPROTO\u UDP。当我传递一个0值作为协议参数时,TCP和UDP按预期工作。

        SOCKET s = socket(AF_INET, SOCK_DGRAM, 0)
    
        // s is a valid socket
    

    IPROTO\u IP protocol参数值的作用是什么?如果它只打算与SOCK\u RAW一起使用,为什么会有这种冗余呢?

    socket(AF_INET, SOCK_STREAM, IPROTO_TCP);
    socket(AF_INET, SOCK_DGRAM, IPROTO_UDP);
    

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

    我想发送UDP数据包(包括广播)从一台电脑与一个以上的网卡到一个特定的以太网段。虽然IP路由通常选择网卡(和源地址),但我想指定适配器,并考虑原始套接字或任何其他方法来实现这一目标。也许这个IP协议在这种情况下会有所帮助。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Len Holgate    15 年前

    我认为socket的文档(可以在这里找到: http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx )很清楚这个值是用来做什么的,如果你不在乎的话,为什么传递0是可以的。

    您可能希望传递不同的内容的情况是,如果您希望为不寻常的连接类型设置套接字;例如蓝牙,或者如果你想创建一个PGM可靠的多播套接字,等等。

    第二个问题与原始套接字或协议参数无关。您需要做的只是将套接字绑定到您想要使用的本地接口的地址;因此,与其绑定到INADDR\u ANY并允许堆栈为您决定,不如告诉它使用哪个接口。