要做个局域网通信的小东西,可有好多疑问。
有几个问题想不明白,问下大家。非常感谢。
1、UDPClient类和Socket类有什么区别,看别人说了很多,可就想不明白,再次问下。
2、使用UDPClient类通信时,是否要知道对方IP。
3、这是从别人提供的代码中的一句话,看不明白。
//得到本机IP,设置端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
那个IPAddress.Any做什么用的。
4、两个用户要通信,怎么确定是要和对方通信,这个和第二个问题差不多吧。C#还没有入门,好多理论的道理都没想明白,希望大家解释下,别打击我。还没有什么没说清楚的我再补充。再次感谢。
有几个问题想不明白,问下大家。非常感谢。
1、UDPClient类和Socket类有什么区别,看别人说了很多,可就想不明白,再次问下。
2、使用UDPClient类通信时,是否要知道对方IP。
3、这是从别人提供的代码中的一句话,看不明白。
//得到本机IP,设置端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
那个IPAddress.Any做什么用的。
4、两个用户要通信,怎么确定是要和对方通信,这个和第二个问题差不多吧。C#还没有入门,好多理论的道理都没想明白,希望大家解释下,别打击我。还没有什么没说清楚的我再补充。再次感谢。
那么怎么获得对方IP呢,不是说UDP是无连接的嘛?这个无连接和对方IP怎么理解。
谢谢。
就跟一个是挂号信需要签名,表明送到,一个是平信,送出去就不管你能否收到,也许在门口信箱就别别人拿走了...
第四个问题:服务器端有监听,客户端知道服务器IP后发送连接请求,服务器端通过请求,连接之后,就可以互通信息了
这个或许没说明白,我是说Socket和UDPClient的区别,好像他们都是Socket,可以这么理解嘛?
谢谢你了。
这里的UDPClient其实就是一个指定了使用udp协议的socket客户端而已,是socket使用的一种方式之一
UdpClient是包装了socket的udp同步方式,简化了程序的编写,但是如果要用udp异步操作,就得用socket,因为udpclient不支持。这是我知道的udpclient和socket的主要区别。
private string[] ipaddrs = new string[50];
private int[] isOpen = new int[50];
private Thread capture;
private byte[] tbuffer = null;
private IPEndPoint udpremotepoint = new IPEndPoint(IPAddress.Any, 0);
private IPEndPoint udplocalpoint = null;
private static ManualResetEvent m_evtListen = new ManualResetEvent(false);
private Socket udpserver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); public void beginReceive()
{
IPHostEntry iphostentry = Dns.GetHostByName(Dns.GetHostName());
if (iphostentry.AddressList.Length > 0)
{
IPAddress localaddress = iphostentry.AddressList[0];
udplocalpoint = new IPEndPoint(localaddress, 8080);
}
udplocal = (EndPoint)udplocalpoint;
udpremote = (EndPoint)udpremotepoint;
udpserver.Bind(udplocal);
capture = new Thread(new ThreadStart(CaptureThread));
capture.Start();
} private void CaptureThread()
{
//while (udpclient != null && Thread.CurrentThread.ThreadState.Equals(System.Threading.ThreadState.Running))
while (Thread.CurrentThread.ThreadState.Equals(System.Threading.ThreadState.Running))
{
m_evtListen.Reset();
tbuffer = null;
tbuffer = new byte[2048];
tbTest.Text = "";
udpserver.BeginReceiveFrom(tbuffer, 0, SocketState.BufferSize, SocketFlags.None, ref udpremote, new AsyncCallback(UdpRecCallback), udpserver);
m_evtListen.WaitOne(); //确认连接上了再继续
}
private void UdpRecCallback(IAsyncResult ar)
{
m_evtListen.Set();//通知主线程继续 Socket server = (Socket)ar.AsyncState; //tbTest.Text = "";
try
{
int bytes = server.EndReceiveFrom(ar, ref udpremote);
if (bytes > 0)
{
string data = Encoding.UTF8.GetString(tbuffer, 0, bytes);
//对接收到的数据进行处理
这里SocketState是个自定义的类:
private class SocketState
{
public Socket worksocket = null; public const int BufferSize = 2048; public byte[] bytes = new byte[BufferSize];
}
如果是用同步方式,在CaptureThread()方法里用一句byte[] recBytes = udpclient.Receive(ref udpremotePoint);就可以了,不需要UdpRecCallback方法和SocketState类,多线程也不需要,简单了许多。
谢谢 paulin 和 hzzasdf