При программировании сокетов был указан недопустимый аргумент.

Я хочу создать 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()

Внутреннее исключение:


person Alireza.Doustmohammadi    schedule 22.11.2017    source источник
comment
Какую ошибку вы получаете?   -  person Laslos    schedule 22.11.2017
comment
Вы можете привязать только один сокет к адресу.   -  person Gusman    schedule 22.11.2017
comment
это можно объяснить?   -  person Alireza.Doustmohammadi    schedule 22.11.2017


Ответы (1)


Ошибка Winsock 10022: WSAEINVAL:

ВСАИНВАЛ
10022

Недопустимый аргумент.
Был указан недопустимый аргумент (например, указан неверный уровень для функции setsockopt). В некоторых случаях это также относится к текущему состоянию сокета — например, вызов accept для сокета, который не прослушивается.

В контексте функции Winsock bind() (которая Socket.Bind() используется внутри), это означает следующее:

WSAEINVAL

Указан недопустимый аргумент.

Эта ошибка возвращается, если сокет s уже привязан к адресу.

После привязки сокета к локальному адресу вы не можете повторно привязать его к новому локальному адресу. Вы должны связать его только один раз.

Итак, в вашем случае вызовите Bind() только после создания socketClint. Не вызывайте его перед каждым вызовом socketClint.ReceiveFrom().

person Remy Lebeau    schedule 22.11.2017
comment
как мы можем иметь несколько сокетов? - person Alireza.Doustmohammadi; 22.11.2017
comment
@Alireza.Doustmohammadi, пожалуйста, уточните свой вопрос - person Remy Lebeau; 22.11.2017