如何解决框架提供的SetSocketOption枚举具有重复的条目这是如何运作的?
在设置System.Net.Sockets.TcpClient
对象时,我正在使用.Client.SetSocketOption()
函数。在the MSN site上找到的枚举列出了枚举值。但是有很多重叠之处,即:
Enum SocketOptionName
Debug = 1
IPOptions = 1
NoChecksum = 1
NoDelay = 1
AcceptConnection = 2
BsdUrgent = 2
Expedited = 2
HeaderIncluded = 2
End Enum
这些设置之间似乎没有同义关系,或者它们与调用它们的SocketOptionLevel
枚举之间没有任何关联。
在没有任何区别的情况下,什么工作有效?
解决方法
这些设置之间似乎没有同义关系,或者它们与调用它们的SocketOptionLevel枚举之间没有任何关联。
SocketOptionName
值通常与彼此不相关,不。但是它们与SocketOptionLevel
值有关。这实际上在SocketOptionLevel
文档中有所说明:
SocketOptionLevel
枚举定义了可以传递给Socket.SetSocketOption
和Socket.GetSocketOption
方法的套接字选项级别。SocketOptionName
枚举值按SocketOptionLevel
分组。
SocketOptionLevel
和SocketOptionName
反映了WinSock setsockopt()
API的level
和optname
参数,其中:
SocketOptionLevel.Socket
(level=SOL_SOCKET
)定义:
-
SocketOptionName.Debug
(optname=SO_DEBUG
) -
SocketOptionName.AcceptConnection
(optname=SO_ACCEPTCONN
) - ...
SocketOptionLevel.IP
(level=IPPROTO_IP
)定义:
-
SocketOptionName.IPOptions
(optname=IP_OPTIONS
) -
SocketOptionName.HeaderIncluded
(optname=IP_HDRINCL
) - ...
SocketOptionLevel.Udp
(level=IPPROTO_UDP
)定义:
-
SocketOptionName.NoChecksum
(optname=UDP_NOCHECKSUM
) - ...
SocketOptionLevel.Tcp
(level=IPPROTO_TCP
)定义:
-
SocketOptionName.NoDelay
(optname=TCP_NODELAY
) -
SocketOptionName.BsdUrgent
(optname=TCP_EXPEDITED_1122
) 1 -
SocketOptionName.Expedited
(optname=TCP_EXPEDITED_1122
) 1 - ...
1:因为SocketOptionName.BsdUrgent
和SocketOptionName.Expedited
都属于SocketOptionLevel.Tcp
并都定义为2,这意味着它们实际上是相同的套接字选项,只是名称不同。在WinSock中,IPPROTO_TCP
级别具有分别为TCP_BSDURGENT
(0x7000)和TCP_EXPEDITED_1122
(0x0002)定义的套接字选项。由于SocketOptionName.BsdUrgent
和SocketOptionName.Expedited
都定义为2,因此它们都表示TCP_EXPEDITED_1122
。 SocketOptionName
文档甚至说它们都实现了RFC 1222(一种错字,实际上就是RFC 1122)。
在没有任何区别的情况下,什么工作有效?
它们之间用SocketOptionLevel
来区分。 SocketOptionLevel
和SocketOptionName
的组合共同定义了可以查询/配置的给定套接字选项。每个SocketOptionLevel
为其定义1个或多个SocketOptionName
值。因此,对于不同的SocketOptionName
值,有重叠SocketOptionLevel
个值的空间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。