使用SendLowWater C#套接字GetSocketOption()/ SetSocketOption

时间:2014-12-15 17:12:11

标签: c# .net sockets

我在套接字类中使用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

2 个答案:

答案 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} }}