±à¼ÍƼö: |
±¾ÎÄÖ÷Òª²ÉÓÃsocketʵÏÖUDP¡¢²ÉÓÃUDPClientÀàʵÏÖÁ½¸öʾÀýÀ´½éÉÜC#µÄUDPÐÒéµÄͬ²½ÊµÏÖ¡£
±¾ÎÄÀ´×ÔÓÚÖªºõ£¬ÓÉ»ðÁú¹ûAnna±à¼ÍƼö |
|
Ò»¡¢ÕªÒª ×ܽá»ùÓÚC#µÄUDPÐÒéµÄͬ²½Í¨ÐÅ¡£
¶þ¡¢ÊµÑéÆ½Ì¨ Visual Studio 2010
Èý¡¢ÊµÑéÔÀí UDP´«ÊäÐÒéͬTCP´«ÊäÐÒéµÄÇø±ð¿É²éÔÄÏà¹ØÎĵµ£¬´Ë´¦²»ÔÙ׸Êö¡£
ËÄ¡¢ÊµÀý 4.1 ²ÉÓÃsocketʵÏÖUDP ÓÉÓÚUDPÊÇÒ»ÖÖÎÞÁ¬½ÓµÄÐÒé¡£Òò´Ë£¬ÎªÁËʹ·þÎñÆ÷Ó¦ÓÃÄܹ»·¢ËͺͽÓÊÕUDPÊý¾Ý°ü£¬ÔòÐèÒª×öÁ½¼þÊÂÇ飺 (1) ´´½¨Ò»¸öSocket¶ÔÏó£» (2) ½«´´½¨µÄÌ×½Ó×Ö¶ÔÏóÓë±¾µØIPEndPoint½øÐа󶨡£ Íê³ÉÉÏÊö²½Öèºó£¬ÄÇô´´½¨µÄÌ×½Ó×Ö¾ÍÄܹ»ÔÚIPEndPointÉϽÓÊÕÁ÷ÈëµÄUDPÊý¾Ý°ü£¬»òÕß½«Á÷³öµÄUDPÊý¾Ý°ü·¢Ë͵½ÍøÂçÖÐÆäËûÈÎÒâÉ豸¡£Ê¹ÓÃUDP½øÐÐͨÐÅʱ£¬²»ÐèÒªÁ¬½Ó¡£ÒòΪÒìµØµÄÖ÷»úÖ®¼äûÓн¨Á¢Á¬½Ó£¬ËùÒÔUDP²»ÄÜʹÓñê×¼µÄSend()ºÍReceive()tÌ×½Ó×Ö·½·¨£¬¶øÊÇʹÓÃÁ½¸öÆäËûµÄ·½·¨£ºSendTo()ºÍReceiveFrom()¡£
SendTo()·½·¨Ö¸¶¨Òª·¢Ë͵ÄÊý¾Ý£¬ºÍÄ¿±ê»úÆ÷µÄIPEndPoint¡£¸Ã·½·¨ÓжàÖÖ²»Í¬µÄʹÓ÷½·¨£¬¿ÉÒÔ¸ù¾Ý¾ßÌåµÄÓ¦ÓýøÐÐÑ¡Ôñ£¬µ«ÊÇÖÁÉÙÒªÖ¸¶¨Êý¾Ý°üºÍÄ¿±ê»úÆ÷¡£ÈçÏ£º SendTo(byte[] data,EndPoint Remote) ReceiveFrom()·½·¨Í¬SendTo()·½·¨ÀàËÆ£¬µ«ÊÇʹÓÃEndPoint¶ÔÏóÉùÃ÷µÄ·½Ê½²»Ò»Ñù¡£ÀûÓÃrefÐÞÊΣ¬´«µÝµÄ²»ÊÇÒ»¸öEndPoint¶ÔÏ󣬶øÊǽ«²ÎÊý´«µÝ¸øÒ»¸öEndPoint¶ÔÏó¡£
UDPÓ¦Óò»ÊÇÑϸñÒâÒåÉϵÄÕæÕýµÄ·þÎñÆ÷ºÍ¿Í»§»ú£¬¶øÊÇÆ½µÈµÄ¹ØÏµ£¬¼´Ã»ÓÐÖ÷Óë´ÎµÄ¹ØÏµ¡£ÎªÁ˼ò±ãÆð¼û£¬ÈÔÈ»°ÑÏÂÃæµÄÕâ¸öÓ¦ÓýÐ×öUDP·þÎñÆ÷¡£
·þÎñÆ÷¶Ë´úÂ룺
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UDP
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024]; //µÃµ½±¾»úIP£¬ÉèÖÃTCP¶Ë¿ÚºÅ
IPEndPoint ip = new IPEndPoint(IPAddress.Any,
8001);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp); //°ó¶¨ÍøÂçµØÖ·
newsock.Bind(ip); Console.WriteLine ("This is a Server,
host name is {0}", Dns.GetHostName()); //µÈ´ý¿Í»§»úÁ¬½Ó
Console.WriteLine("Waiting for a client"); //µÃµ½¿Í»§»úIP
IPEndPoint sender = new IPEndPoint(IPAddress.Any,
0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from
{0}: ", Remote.ToString());
Console.WriteLine (Encoding.ASCII.GetString(data,
0, recv)); //¿Í»§»úÁ¬½Ó³É¹¦ºó£¬·¢ËÍÐÅÏ¢
string welcome = "ÄãºÃ ! "; //×Ö·û´®Óë×Ö½ÚÊý×éÏ໥ת»»
data = Encoding.ASCII.GetBytes (welcome); //·¢ËÍÐÅÏ¢
newsock.SendTo(data, data.Length, SocketFlags.None,
Remote);
while (true)
{
data = new byte[1024];
//·¢ËͽÓÊÕÐÅÏ¢
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data,
0, recv));
newsock.SendTo(data, recv, SocketFlags.None,
Remote);
}
} }
} |
¶ÔÓÚ½ÓÊÕÁ÷ÈëµÄUDP·þÎñÆ÷³ÌÐòÀ´Ëµ£¬±ØÐ뽫³ÌÐòÓë±¾µØÏµÍ³ÖÐÖ¸¶¨µÄUDP¶Ë¿Ú½øÐа󶨡£Õâ¾Í¿ÉÒÔͨ¹ýʹÓúÏÊʵı¾µØIPµØÖ·´´½¨Ò»¸öIPEndPoint¶ÔÏó£¬ÒÔ¼°ºÏÊʵÄUDP¶Ë¿ÚºÅ¡£ÉÏÊö·¶Àý³ÌÐòÖеÄUDP·þÎñÆ÷Äܹ»ÔÚ¶Ë¿Ú8001´ÓÍøÂçÉϽÓÊÕÈÎÒâÁ÷ÈëµÄUDPÊý¾Ý°ü¡£
UDP¿Í»§»ú³ÌÐòÓë·þÎñÆ÷³ÌÐò·Ç³£ÀàËÆ¡£ ÒòΪ¿Í»§»ú²»ÐèÒªÔÚÖ¸¶¨µÄUDP¶Ë¿ÚµÈ´ýÁ÷ÈëµÄÊý¾Ý£¬Òò´Ë£¬²»Ê¹ÓÃBind()·½·¨£¬¶øÊÇʹÓÃÔÚÊý¾Ý·¢ËÍÊ±ÏµÍ³Ëæ»úÖ¸¶¨µÄÒ»¸öUDP¶Ë¿Ú£¬¶øÇÒʹÓÃͬһ¸ö¶Ë¿Ú½ÓÊÕ·µ»ØµÄÏûÏ¢¡£ÔÚ¿ª·¢²úƷʱ£¬ÒªÎª¿Í»§»úÖ¸¶¨Ò»Ì×UDP¶Ë¿Ú£¬ÒÔ±ã·þÎñÆ÷ºÍ¿Í»§»ú³ÌÐòʹÓÃÏàͬµÄ¶Ë¿ÚºÅ¡£UDP¿Í»§»ú³ÌÐòÊ×Ïȶ¨ÒåÒ»¸öIPEndPoint£¬UDP·þÎñÆ÷½«·¢ËÍÊý¾Ý°üµ½Õâ¸öIPEndPoint¡£Èç¹ûÔÚÔ¶³ÌÉ豸ÉÏÔËÐÐUDP·þÎñÆ÷³ÌÐò£¬ÔÚIPEndPoint¶¨ÒåÖбØÐëÊäÈëÊʵ±µÄIPµØÖ·ºÍUDP¶Ë¿ÚºÅÐÅÏ¢¡£
¿Í»§¶Ë´úÂ룺
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets; namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData; //¹¹½¨TCP ·þÎñÆ÷
Console.WriteLine("This is a Client, host
name is {0}", Dns.GetHostName()); //ÉèÖ÷þÎñIP£¬ÉèÖÃTCP¶Ë¿ÚºÅ
IPEndPoint ip = new IPEndPoint (IPAddress.Parse("127.0.0.1"),
8001); //¶¨ÒåÍøÂçÀàÐÍ£¬Êý¾ÝÁ¬½ÓÀàÐͺÍÍøÂçÐÒéUDP
Socket server = new Socket (AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp); string welcome = "ÄãºÃ! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None,
ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any,
0);
EndPoint Remote = (EndPoint)sender; data = new byte[1024];
//¶ÔÓÚ²»´æÔÚµÄIPµØÖ·£¬¼ÓÈë´ËÐдúÂëºó£¬¿ÉÒÔÔÚÖ¸¶¨Ê±¼äÄÚ½â³ý×èÈûģʽÏÞÖÆ
int recv = server.ReceiveFrom( data, ref Remote);
Console.WriteLine("Message received from
{0}: ", Remote.ToString());
Console.WriteLine (Encoding.ASCII.GetString
(data, 0, recv));
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo (Encoding.ASCII.GetBytes(input),
Remote);
data = new byte[1024];
recv = server.ReceiveFrom (data, ref Remote);
stringData = Encoding.ASCII.GetString (data,
0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine ("Stopping Client.");
server.Close();
} }
} |
ÉÏÊö´úÂëµÄʵÏÖÂ߼Ϊ£ºÏà¹ØÉèÖÃÍê³Éºó£¬·þÎñÆ÷¶ËÏÈÏò¿Í»§¶Ë·¢ËÍÐÅÏ¢£¬Ö®ºó¿Í»§¶Ëͨ¹ý¼üÅÌ·¢ËÍ×Ö·û´®£¬·þÎñÆ÷¶ËÊÕµ½ºóÔÙ·¢Ë͸ø¿Í»§¶Ë£¬Èç´ËÑ»·¡£
4.2 ²ÉÓÃUDPClientÀàʵÏÖ
·þÎñÆ÷¶Ë´úÂ룺
using System;
using System.Net;
using System.Net.Sockets;
using System.Text; public class Custom
{
// ÉèÖÃIP£¬IPV6
private static readonly IPAddress GroupAddress
= IPAddress.Parse("IPµØÖ·");
// ÉèÖö˿Ú
private const int GroupPort = 11000; private static void StartListener()
{
bool done = false; UdpClient listener = new UdpClient(); IPEndPoint groupEP = new IPEndPoint(GroupAddress,
GroupPort); try
{
//IPV6£¬×é²¥
listener.JoinMulticastGroup(GroupAddress); listener.Connect(groupEP); while (!done)
{
Console.WriteLine("Waiting for broadcast"); byte[] bytes = listener.Receive(ref groupEP); Console.WriteLine("Received broadcast
from {0} :\n {1}\n", groupEP.ToString(),
Encoding.ASCII.GetString(bytes, 0, bytes.Length));
} listener.Close(); }
catch (Exception e)
{
Console.WriteLine(e.ToString());
} } public static int Main(String[] args)
{
StartListener(); return 0;
}
} |
¿Í»§¶Ë´úÂ룺
using System;
using System.Net;
using System.Net.Sockets;
using System.Text; public class Client
{ private static IPAddress GroupAddress = IPAddress.Parse("IPµØÖ·"); private static int GroupPort = 11000; private static void Send(String message)
{
UdpClient sender = new UdpClient(); IPEndPoint groupEP = new IPEndPoint(GroupAddress,
GroupPort); try
{
Console.WriteLine("Sending datagram : {0}",
message); byte[] bytes = Encoding.ASCII.GetBytes(message); sender.Send(bytes, bytes.Length, groupEP); sender.Close(); }
catch (Exception e)
{
Console.WriteLine(e.ToString());
} } public static int Main(String[] args)
{
Send(args[0]); return 0;
}
} |
ÒÔÉÏ´úÂëÐèҪ˵Ã÷µÄÊÇ£º
(1) ÉÏÊö´úÂëÊÇ»ùÓÚIPV6µØÖ·µÄ×鲥ģʽ¡£IPv4ÖеĹ㲥(broadcast)¿ÉÒÔµ¼ÖÂÍøÂçÐÔÄܵÄϽµÉõÖÁ¹ã²¥·ç±©(broadcast
storm)¡£ÔÚIPv6ÖоͲ»´æÔڹ㲥ÕâÒ»¸ÅÄîÁË£¬È¡¶ø´úÖ®µÄÊÇ×é²¥(multicast)ºÍÈÎÒâ²¥(anycast)¡£
(2) IPV6µØÖ·±íʾ·½·¨£º
a) X:X:X:X:X:X:X:X(ÿ¸öX´ú±í16λµÄ16½øÖÆÊý×Ö)£¬²»Çø·Ö´óСд£»
b) ÅÅÍ·µÄ0¿ÉÊ¡ÂÔ£¬±ÈÈç09C0¾Í¿ÉÒÔд³É9C0£¬0000¿ÉÒÔд³É0£»
c) Á¬ÐøÎª0µÄ×ֶοÉÒÔÒÔ::À´´úÌæ£¬µ«ÊÇÕû¸öµØÖ·ÖÐ::Ö»ÄܳöÏÖÒ»´Î£¬±ÈÈçFF01:0:0:0:0:0:0:1¾Í¿ÉÒÔ¼òд³ÉFF01::1¡£
(3) Èç¹ûÊDzÉÓô°ÌåµÄÐÎʽ½¨ÒéʹÓöàỊ̈߳¬ÈçÏÂÕâÖÖ¸ñʽ£¬·ñÔòÔÚ½ÓÊÕÊý¾Ýʱ¿ÉÄÜ»á³öÏÖËÀ»úµÄÏÖÏó¡£
// ´´½¨Ò»¸ö×ÓÏß³Ì Thread thread = new Thread(
delegate()
{
try
{
//ÔÚÕâÀïдÄãµÄ´úÂë
}
catch (Exception )
{ }
}
); thread.Start(); |
|