C# Udp Socket网络编程 (在线等)

snailiest 2009-07-12 06:54:23
要做个局域网通信的小东西,可有好多疑问。
有几个问题想不明白,问下大家。非常感谢。
1、UDPClient类和Socket类有什么区别,看别人说了很多,可就想不明白,再次问下。
2、使用UDPClient类通信时,是否要知道对方IP。
3、这是从别人提供的代码中的一句话,看不明白。
//得到本机IP,设置端口号
IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);
那个IPAddress.Any做什么用的。
4、两个用户要通信,怎么确定是要和对方通信,这个和第二个问题差不多吧。

C#还没有入门,好多理论的道理都没想明白,希望大家解释下,别打击我。

还没有什么没说清楚的我再补充。

再次感谢。
...全文
1723 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
itcoco 2012-07-13
  • 打赏
  • 举报
回复
看看大家的关于udp的讨论
怪怪 2011-10-09
  • 打赏
  • 举报
回复
snailiest 2009-07-21
  • 打赏
  • 举报
回复
不好意思,最近一忙给忘结贴了。
谢谢 paulin 和 hzzasdf
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 paulin 的回复:]
socket可以选择多种协议进行传输,包括tcp,udp,ftp
这里的UDPClient其实就是一个指定了使用udp协议的socket客户端而已,是socket使用的一种方式之一
[/Quote]

谢谢你了,今天解决我好多疑问了。
  • 打赏
  • 举报
回复
贴上一段在udp广播模式下,异步接收数据的代码:
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类,多线程也不需要,简单了许多。
cumtnuist 2009-07-12
  • 打赏
  • 举报
回复
帮顶
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hzzasdf 的回复:]
Udp的广播模式下不需要知道对方的IP,指定IPAddress.Any就可以了,等于是一个在网络上发udp数据包,任何节点都可以接收。
UdpClient是包装了socket的udp同步方式,简化了程序的编写,但是如果要用udp异步操作,就得用socket,因为udpclient不支持。这是我知道的udpclient和socket的主要区别。

[/Quote]

这里有个疑问,可是我实验过了,服务器和客户端在同一台机子上的话还行,要不在同一台机器上就出现了远“程主机强迫关闭了一个现有的连接。”这个异常。

是不是可以使用你说的广播获取局域网内其他客户端的IP?
  • 打赏
  • 举报
回复
Udp的广播模式下不需要知道对方的IP,指定IPAddress.Any就可以了,等于是一个在网络上发udp数据包,任何节点都可以接收。
UdpClient是包装了socket的udp同步方式,简化了程序的编写,但是如果要用udp异步操作,就得用socket,因为udpclient不支持。这是我知道的udpclient和socket的主要区别。
paulin 2009-07-12
  • 打赏
  • 举报
回复
socket可以选择多种协议进行传输,包括tcp,udp,ftp
这里的UDPClient其实就是一个指定了使用udp协议的socket客户端而已,是socket使用的一种方式之一
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 paulin 的回复:]
tcp是可靠的,需要确定数据顺利传输,而udp是不可靠的,把数据送出去就不管了
就跟一个是挂号信需要签名,表明送到,一个是平信,送出去就不管你能否收到,也许在门口信箱就别别人拿走了...
[/Quote]

这个或许没说明白,我是说Socket和UDPClient的区别,好像他们都是Socket,可以这么理解嘛?
谢谢你了。
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 paulin 的回复:]
第三个问题:IPAddress.Any表明不是针对某一固定ip监听,而是对网络上的虽有ip都是开放的
[/Quote]

原来说的是这个呀。
paulin 2009-07-12
  • 打赏
  • 举报
回复
第三个问题:IPAddress.Any表明不是针对某一固定ip监听,而是对网络上的虽有ip都是开放的
第四个问题:服务器端有监听,客户端知道服务器IP后发送连接请求,服务器端通过请求,连接之后,就可以互通信息了
paulin 2009-07-12
  • 打赏
  • 举报
回复
tcp是可靠的,需要确定数据顺利传输,而udp是不可靠的,把数据送出去就不管了
就跟一个是挂号信需要签名,表明送到,一个是平信,送出去就不管你能否收到,也许在门口信箱就别别人拿走了...
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 paulin 的回复:]
连接和无连接只是说传输的数据包采用什么方式
对方的IP还是需要的,不然怎么通信,就跟邮局投递邮件一样,总要知道门牌号才能找到,才能把信件准确送到..
[/Quote]

好的,明白了,这个问题解决了。
还有其他三个呢。
paulin 2009-07-12
  • 打赏
  • 举报
回复
连接和无连接只是说传输的数据包采用什么方式
对方的IP还是需要的,不然怎么通信,就跟邮局投递邮件一样,总要知道门牌号才能找到,才能把信件准确送到..
snailiest 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jijunwu 的回复:]
需要知道对方的IP
才能进行通信
[/Quote]

那么怎么获得对方IP呢,不是说UDP是无连接的嘛?这个无连接和对方IP怎么理解。
谢谢。
  • 打赏
  • 举报
回复
需要知道对方的IP
才能进行通信
LQknife 2009-07-12
  • 打赏
  • 举报
回复
网上一堆堆的socket的
snailiest 2009-07-12
  • 打赏
  • 举报
回复
经常出现这么一个异常:
远程主机强迫关闭了一个现有的连接。
这是为什么呢?

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧