首页 > 解决方案 > Socket.SetSocketOption 在 Mac OS 和 Linux 上抛出无效参数异常,但在 Windows 上工作正常

问题描述

Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout);

如果超时设置为 -1,则该方法在 Windows 上运行良好,但在 Linux 和 Mac 上失败,并出现以下异常

System.Net.Sockets.SocketException (22): System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue, System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)布尔静默)在 System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, Int32 optionValue)

如果在 mac 和 linux 上 timeout 设置为 0,也不例外。

1) 如果超时设置为 -1,它会在 Windows 上进行无限期轮询。timeout=0 会在 Windows 上做同样的事情吗?

2)如果超时设置为0,则在Linux上?它会进行无限期的民意调查吗?

当我使用 0 超时时,应用程序会间歇性地失败

    System.NotSupportedException: The BeginWrite method cannot be called >when another write operation is pending.
      at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, >Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
      at System.Net.Security._SslStream.BeginWrite(Byte[] buffer, Int32 >offset, Int32 count, AsyncCallback asyncCallback, Object asyncState)

标签: c#.netlinuxsockets.net-core

解决方案


1) 如果超时设置为 -1,它会在 Windows 上进行无限期轮询。timeout=0 会在 Windows 上做同样的事情吗?

2)如果超时设置为0,则在Linux上?它会进行无限期的民意调查吗?

是的,根据Socket.RecieveTimeout的文档,0 和 -1 的值都具有相同的行为

超时值,以毫秒为单位。默认值为 0,表示无限超时。指定 -1 还表示无限超时。


推荐阅读