套接字编程中提供了无效参数

时间:2017-11-22 17:52:43

标签: c# sockets udp udpclient

我想在C#中创建一个UDP客户端和服务器,当我运行它们时,在第一次发送和接收消息之后,这个错误实现了。我的代码是:

byte[] barray = new byte[1024];
EndPoint ipre = new IPEndPoint(IPAddress.Any, 4040);
socketClint.Bind((IPEndPoint)ipre);
int rc = socketClint.ReceiveFrom(barray, ref ipre);

if (rc > 0)
{
    listBox1.Items.Add("Server: "+ BitConverter.ToInt32(barray,0));
}

此错误大约是socketClint.Bind((IPEndPoint)ipre);行。

错误是:

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.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at client1.Form1.getmsg() in c:\Users\Inspiron 1545\Desktop\UDP\client1\client1\Form1.cs:line 38
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   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:

1 个答案:

答案 0 :(得分:0)

Winsock错误10022是WSAEINVAL

  

WSAEINVAL
  10022

     

参数无效。
  提供了一些无效参数(例如,为setsockopt函数指定了无效级别)。 在某些情况下,它还引用套接字的当前状态 - 例如,在未侦听的套接字上调用accept

在Winsock bind()函数的上下文中(Socket.Bind()在内部使用),它意味着:

  

WSAEINVAL

     

提供了无效参数。

     

如果套接字s已绑定到某个地址,则会返回此错误。

一旦套接字绑定到本地地址,您就无法将其重新绑定到新的本地地址。你应该只绑定它一次。

因此,在您的情况下,请仅在创建Bind()后致电socketClint。在每次致电socketClint.ReceiveFrom()之前不要打电话给它。