Socket communication C#
本文关键字:communication Socket | 更新日期: 2023-09-27 18:14:58
我使用这个类从/发送Echo测试到我的应用程序
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();
}
}
,下面是我的用法:
SocketClient client = new SocketClient();
client.Send("192.168.1.2",77 , "besm ellah");
textBox1.Text=client.Recieve(77);
它总是通过参数异常在socket.SendToAsync(socketEventArg);
未处理"参数remoteEP不能是DnsEndPoint类型。"参数名称:remoteEP"
我在windows功能上启用了简单的TCP/IP功能,但它也不起作用。
- update -
我试着把代码改成:
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
socketEventArg.RemoteEndPoint = new IPEndPoint(localIPs[3], portNumber);
它没有给出异常,但是消息没有通过。
嗯,看起来您应该将其更改为不同类型的端点,而不是DNS端点。
我认为你应该使用IPEndPoint
http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx