c#和UDP SOCKET广播

简介: server:  Socket sock = new Socket(AddressFamily.InterNetwork,  SocketType.Dgram,ProtocolType.

server: 

Socket sock = new Socket(AddressFamily.InterNetwork, 
SocketType.Dgram,ProtocolType.Udp); 
//255.255.255.255 
IPEndPoint iep1 = 
new IPEndPoint(IPAddress.Broadcast, 9050); 
IPEndPoint iep2 = 
new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050); 

string hostname = Dns.GetHostName(); 
byte[] data = Encoding.ASCII.GetBytes(hostname); 

sock.SetSocketOption(SocketOptionLevel.Socket, 
SocketOptionName.Broadcast, 1); 
sock.SendTo(data, iep1); 
sock.SendTo(data, iep2); 
sock.Close(); 

client: 

Socket sock = new Socket(AddressFamily.InterNetwork, 
SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
sock.Bind(iep); 

EndPoint ep = (EndPoint)iep; 
Console.WriteLine("Ready to receive…"); 

byte[] data = new byte[1024]; 
int recv = sock.ReceiveFrom(data, ref ep); 
string stringData = Encoding.ASCII.GetString(data, 0, recv); 

Console.WriteLine("received: {0} from: {1}"
stringData, ep.ToString()); 
data = new byte[1024]; 
recv = sock.ReceiveFrom(data, ref ep); 
stringData = Encoding.ASCII.GetString(data, 0, recv); 
Console.WriteLine("received: {0} from: {1}"
stringData, ep.ToString()); 
sock.Close();


C#广播程序

前言

在网络编程中,通过广播和多播可以实现发送端发送一个数据包,有多个接收端接收的情况。


广播

由于Tcp是有连接的,所以不能用来发送广播消息。发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息。广播消息的目的IP地址是一种特殊IP地址,称为广播地址。广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255是192.169.1.0这个网络的广播地址;130.168.255.255是130.168.0.0这个网络的广播地址。向全部为1的IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。


C#中发送广播消息的过程如下,注意要调用SetSockOption函数,不然要抛出异常:

    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,

        ProtocolType.Udp); //255.255.255.255  IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);   

    IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050); string hostname = Dns.GetHostName(); byte[] data = Encoding.ASCII.GetBytes(hostname);   



    sock.SetSocketOption(SocketOptionLevel.Socket,

        SocketOptionName.Broadcast, 1);   

    sock.SendTo(data, iep1);   

    sock.SendTo(data, iep2);   

    sock.Close();



C#中接收广播消息的过程如下,没有什么特别的:

   Socket sock = new Socket(AddressFamily.InterNetwork,

        SocketType.Dgram, ProtocolType.Udp);   

    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);   

    sock.Bind(iep);   

    EndPoint ep = (EndPoint)iep;   

    Console.WriteLine("Ready to receive…"); byte[] data = new byte[1024]; int recv = sock.ReceiveFrom(data, ref ep); string stringData = Encoding.ASCII.GetString(data, 0, recv); 

    

    Console.WriteLine("received: {0} from: {1}",

        stringData, ep.ToString());   

    data = new byte[1024];   

    recv = sock.ReceiveFrom(data, ref ep);  

    stringData = Encoding.ASCII.GetString(data, 0, recv);  

    Console.WriteLine("received: {0} from: {1}",           

       stringData, ep.ToString());   

    sock.Close();

Attentions:
1 广播可以由客户程序来通知子网内的服务程序,自己的位置。2 发送广播消息时指定的端口也是有作用的,接收端的Udp Socket如果Bind到此接口的话,就能够接收到消息。(如果不Bind的话,就能接收所有端口的消息??)

3 接收端接到的包中显示的远端IP地址是发送端的地址。就是说广播地址不会显示到一个包的源IP地址位置(LoopBack地址不会显示到包的目的IP地址位置)

4 可以用线程不停地发送和接收广播消息,确认两端的位置和证明自己的存在


来自博客:
http://www.csharpwin.com/csharpspace/2914.shtml

相关文章
|
1月前
|
存储 Python
Python网络编程基础(Socket编程) UDP 发送和接收数据
【4月更文挑战第10天】对于UDP客户端而言,发送数据是一个相对简单的过程。首先,你需要构建一个要发送的数据报,这通常是一个字节串(bytes)。然后,你可以调用socket对象的`sendto`方法,将数据报发送到指定的服务器地址和端口。
|
1月前
|
存储 Python
Python网络编程基础(Socket编程)UDP客户端编程
【4月更文挑战第9天】在UDP通信中,客户端负责发送数据到服务器,并接收来自服务器的响应。与服务器不同,客户端通常不需要绑定到特定的地址和端口,因为它可以临时使用任何可用的端口来发送数据。下面,我们将详细讲解UDP客户端编程的基本步骤。
|
1月前
|
网络协议 Python
Python网络编程基础(Socket编程)创建UDP socket对象
【4月更文挑战第8天】在Python中创建UDP服务器涉及使用`socket`模块创建socket对象,如`udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)`,然后绑定到特定IP地址和端口,如`udp_socket.bind(('localhost', 12345))`。服务器通过`recvfrom`在无限循环中监听和接收数据报。这只是基础,实际应用还需处理接收、解析、响应及错误处理等。接下来可学习如何利用socket对象进行数据交互以构建完整服务器。
|
1月前
|
网络协议 网络性能优化 开发者
Python网络编程基础(Socket编程)UDP Socket编程
【4月更文挑战第8天】Python网络编程中,UDP与TCP协议各有特点。TCP提供可靠连接,确保数据顺序与完整性,适合文件传输等;UDP则无连接,速度快,常用于实时音视频,牺牲了数据可靠性。Python的socket库支持两者,开发者可根据需求选择。
|
2月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
7月前
|
安全 网络协议 Java
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
40 0
|
20天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
25天前
|
C#
C# 使用Socket对接
C# 使用Socket对接
16 1
|
1月前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
2月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【2月更文挑战第19天】
TCP 和 UDP 的 Socket 调用