【问题标题】:TcpClient and UdpClient throwing errorsTcpClient 和 UdpClient 抛出错误
【发布时间】:2013-02-11 19:07:11
【问题描述】:

在运行 Windows 7 x64 和 VS2012 U1 并使用 .Net 4 的两个系统上,如果我调用 UdpClient 或 TcpClient,则会收到错误“提供了无效参数”。

我尝试了多个端口,并且验证了这些端口尚未绑定,但我每次都收到相同的错误。

我也尝试使用提升的权限运行代码,但无济于事。

测试代码:

try
        {
            using (UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 123)))
            {
                Console.WriteLine("Port is open");
            }
        }
        catch (SocketException error)
        {
            Console.WriteLine("Error:\n{0}", error.Message);
        }

错误输出:

System.Net.Sockets.SocketException was unhandled
  HResult=-2147467259
  Message=An invalid argument was supplied
  Source=System
  ErrorCode=10022
  NativeErrorCode=10022
  StackTrace:
       at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
       at System.Net.Sockets.UdpClient..ctor(IPEndPoint localEP)
       at GetNTPTime.Program.Main(String[] args) in z:\My Documents\Dropbox\Dev\C#\_Example\GetNTPTime\GetNTPTime\Program.cs:line 15
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

请注意,如果我简单地调用 UdpClient client = new UdpClient();

,我会得到同样的错误

【问题讨论】:

  • 问:您是否尝试过使用特定端口号(而不是 InAddrAny)?示例:UdpClient udpClient = new UdpClient(11000); udpClient.Connect("www.myurl.com", 11000);
  • 答:是的,两个系统上的结果相同。

标签: c# sockets tcp udp windows-7-x64


【解决方案1】:

问题是我的代码是从 Dropbox 文件夹中执行的,并且由于某种原因导致了问题,即使 Dropbox 当时没有在系统上运行。如果我将代码库移动到桌面并运行它,一切正常。

更新

我做了更多研究,发现问题不是 Dropbox 而是 Cloudfogger,如果我关闭 Cloudfogger 一切正常。

【讨论】:

  • 当然,Cloudfogger 正在加密您在 Dropbox 文件夹中的文件。问:将您的文件移出 Dropbox,或关闭 Cloudfogger 都可以解决问题,对吗?当你有机会时,一定要“接受”你的答案。
  • 是的,将文件移出或关闭 Cloudfogger 可以解决问题。
【解决方案2】:

我看到您在示例中使用端口 123,这可能是一个不好的选择,因为它属于保留范围,特别是 Network Time Protocol 使用了 123。尝试使用 1024 以上的未保留端口。

如果您仍然遇到错误

UdpClient client = new UdpClient();

我猜你的系统有问题。如果可以,请尝试在不同的机器上运行相同的可执行文件。

【讨论】:

  • 端口 123 是我想使用的端口,因为我正在编写一个 NTP 客户端/服务器,但我尝试使用未保留范围内的端口,但没有成功。我尝试在两个系统上运行相同的代码,结果都相同。
  • @Sane - 您能否单步执行您的代码并准确告诉我哪些行引发了异常(从您的帖子中不清楚)?
  • UdpClient 抛出异常,或者如果我将其更改为 TcpClient 我得到相同的异常。例如,如果我使用您上面的代码,我会得到异常。
  • 好的,你可以试试 { UdpClient client = new UdpClient(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } 并将错误字符串粘贴到 cmets 中。
  • System.Net.Sockets.SocketException (0x80004005):在 System.Net 的 System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType) 处提供了无效参数。 Sockets.UdpClient.createClientSocket() at GetNTPTime.Program.Main(String[] args) in Program.cs:line 15
猜你喜欢
  • 2011-08-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多