我在套接字类中使用SendLowWater的GetSocketOption()和SetSocketOption()方法时遇到了麻烦。
我尝试使用
byte[] values = new byte[100];
sock.GetSocketOption(System.Net.Sockets.SocketOptionLevel.Socket, System.Net.Sockets.SocketOptionName.SendLowWater, values);
我在函数调用时遇到以下异常:在getsockopt或setsockopt调用中指定了未知,无效或不支持的选项或级别
有人知道如何在SendLowWater中使用GetSocketOption / SetSocketOption吗?
谢谢你, KAB
答案 0 :(得分:2)
在我看来,错误信息是不言自明的:"发送低水" Windows不支持选项。
幸运的是,你真的不需要这个选项。它用于控制Winsock select()
函数的行为,在.NET中显示为Socket.Select()
,这对于有效使用.NET Socket
类是不需要的。 。相反,您应该使用其中一种异步方法来使用Socket
。
我现在个人偏好C#具有async
/ await
功能,将Socket
包裹在NetworkStream
中并使用Stream.ReadAsync()
和{{ 1}}方法。与其他异步方法一样,这些方法将使用IOCP来处理异步行为(Windows中最高效的I / O模型),但这种方式比其他两个基于Stream.WriteAsync()
的异步方法更方便。
答案 1 :(得分:1)
你没有。
SocketOptionName.SendLowWater
对应SO_SNDLOWAT
(4099),MSDN documents不支持:
包含BSD UNIX的套接字选项,以实现向后兼容。 此选项设置要为套接字处理的最小字节数 输出操作。
Windows TCP / IP提供程序不支持此选项。如果这 选项用于Windows Vista及更高版本的getsockopt和 setsockopt函数失败,
WSAEINVAL
。在早期版本的 Windows,这些函数失败了WSAENOPROTOOPT
。
Socket
类是围绕Winsock函数的低级包装器,因此如果某些内容失败,通常可以通过确定操作对应的本机调用来查找更详细的信息(在本例中为{{1} }}