Socket.SetSocketOption在Mac OS和Linux上引发无效的参数异常,但在Windows上运行正常

时间:2019-06-14 10:06:06

标签: c# .net linux sockets .net-core

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

如果将超时设置为-1,则该方法在Windows上可以正常运行,但在Linux和Mac上会失败,但以下情况除外

  

System.Net.Sockets.SocketException(22):处的无效参数   System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError   错误,字符串callerName)在   System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel   optionLevel,SocketOptionName optionName,Int32 optionValue,布尔值   静默)在System.Net.Sockets.Socket.SetSocketOption(SocketOptionLevel   optionLevel,SocketOptionName optionName,Int32 optionValue)

如果在Mac和Linux上将超时设置为0,则没有例外。

1)如果超时设置为-1,则会在Windows上进行不确定的轮询。在Windows上timeout = 0会做同样的事情吗?

2)在Linux上,如果超时设置为0?它会进行不确定的轮询吗?

当我使用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)

1 个答案:

答案 0 :(得分:1)

  

1)如果超时设置为-1,则会在Windows上进行不确定的轮询。将   timeout = 0是否在Windows上也一样?

     

2)在Linux上,如果超时设置为0?它会进行不确定的轮询吗?

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

  

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