C # socket communication

I use this class to send an Echo test from / to my application

public class SocketClient { Socket socket = null; static ManualResetEvent clientDone = new ManualResetEvent(false); const int TIMEOUT_MILLISECONDS = 5000; const int MAX_BUFFER_SIZE = 2048; public SocketClient() { socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); } public string Send(string serverName, int portNumber, string data) { string response = "Timeout"; if (socket != null) { SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs(); socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName, portNumber); socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e) { response = e.SocketError.ToString(); clientDone.Set(); }); byte[] payload = Encoding.UTF8.GetBytes(data); socketEventArg.SetBuffer(payload, 0, payload.Length); clientDone.Reset(); socket.SendToAsync(socketEventArg); clientDone.WaitOne(TIMEOUT_MILLISECONDS); } else { response = "not initialized"; } return response; } public string Recieve(int portNumber) { string response = "Timeout"; if (socket != null) { SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs(); socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE); socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); response.Trim('\0'); } else { response = e.SocketError.ToString(); } clientDone.Set(); }); socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber); clientDone.Reset(); socket.ReceiveFromAsync(socketEventArg); clientDone.WaitOne(TIMEOUT_MILLISECONDS); } return response; } public void Close() { socket.Close(); } } 

and here is how I use it:

  SocketClient client = new SocketClient(); client.Send("192.168.1.2",77 , "besm ellah"); textBox1.Text=client.Recieve(77); 

He always through Argument Exception was raw in socket.SendToAsync(socketEventArg); Msgstr "The remoteEP parameter must not be of type DnsEndPoint." "Parameter name: remoteEP"

I have enabled the simple TCP / IP function in Windows functions, but it also does not work.

-update -

I tried changing the code:

 IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); socketEventArg.RemoteEndPoint = new IPEndPoint(localIPs[3], portNumber); 

it does not give an exception, but the message does not pass.

+4
source share
1 answer

Well, it looks like you should change it to a different type of endpoint, not a DNS endpoint.

I think you should use IPEndPoint

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

+1
source

Source: https://habr.com/ru/post/1381355/


All Articles