C#中UDP(Socket)

1 使用无连接的套接字,我们能够在自我包含的数据包里发送消息,采用独立的读函数读取消息,读取的消息是使用独立的发送函数发送的。但是UDP数据包不能保证可靠传输,存在许多的因素,比如网络繁忙等等,都有可能阻止数据包到达指定的目的地。
2 (1)UDP的简单应用:
3 由于UDP是一种无连接的协议。因此,为了使服务器应用能够发送和接收UDP数据包,则需要做两件事情:
4 创建一个Socket对象;
5 将创建的套接字对象与本地IPEndPoint进行绑定。
6 完成上述步骤后,那么创建的套接字就能够在IPEndPoint上接收流入的UDP数据包,或者将流出的UDP数据包发送到网络中任意其他设备商。使用UDP进行通信时,不需要TCP连接。因为异地的主机之间没有建立连接,所以UDP不能使用标准的Send()和Receive()t套接字方法,而是使用两个其他的方法:SendTo()和ReceiveFrom()。
7 SendTo()方法指定要发送的数据,和目标机器的IPEndPoint。该方法有多种不同的使用方法,可以根据具体的应用进行选择,但是至少要指定数据包和目标机器。如下:
8 SendTo(byte[] data,EndPoint Remote)
9 ReceiveFrom()方法同SendTo()方法类似,但是使用EndPoint对象声明的方式不一样。利用ref修饰,传递的不是一个EndPoint对象,而是将参数传递给一个EndPoint对象。
10 (2)UDP服务器
11 UDP应用不是严格意义上的真正的服务器和客户机,而是平等的关系,即没有主与次的关系。为了简便起见,仍然把下面的这个应用叫做UDP服务器。源代码如下:
12 using System;
13 using System.Collections.Generic;
14 using System.Text;
15 using System.Net;
16 using System.Net.Sockets;
17 namespace SimpleUdpSrvr
18 {
19 class Program
20 {
21 static void Main(string[] args)
22 {
23 int recv;
24 byte[] data = new byte[1024];
25 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点
26 Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);//定义一个Socket
27 newsock.Bind(ipep);//Socket与本地的一个终结点相关联
28 Console.WriteLine("Waiting for a client.....");
29
30 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址
31 EndPoint Remote = (EndPoint)(sender);//
32 recv = newsock.ReceiveFrom(data, ref Remote);//接受数据
33 Console.WriteLine("Message received from{0}:", Remote.ToString());
34 Console.WriteLine(Encoding.ASCII.GetBytes(data,0,recv));
35
36 string welcome = "Welcome to my test server!";
37 data = Encoding.ASCII.GetBytes(welcome);
38 newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
39 while (true)
40 {
41 data = new byte[1024];
42 recv = newsock.ReceiveFrom(data, ref Remote);
43 Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
44 newsock.SendTo(data, recv, SocketFlags.None, Remote);
45 }
46 }
47 }
48 }
49 对于接收流入的UDP服务器程序来说,必须将程序与本地系统中指定的UDP端口进行绑定。这就可以通过使用合适的本地IP地址创建一个IPEndPoint对象,以及何时的UDP端口号。上述范例程序中的UDP服务器能够在端口9050从网络上接收任意流入的UDP数据包。
50 (3)UDP客户机
51 UDP客户机程序与服务器程序非常类似。
52 因为客户机不需要在指定的UDP端口等待流入的数据,因此,不使用Bind()方法,而是使用在数据发送时系统随机指定的一个UDP端口,而且使用同一个端口接收返回的消息。在看法产品时,要为客户机指定一套UDP端口,以便服务器和客户机程序使用相同的端口号。UDP客户机程序首先定义一个IPEndPoint,UDP服务器将发送数据包到这个IPEndPoint。如果在远程设备上运行UDP服务器程序,在IPEndPoint定义中必须输入适当的IP地址和UDP端口号信息。
53 using System;
54 using System.Collections.Generic;
55 using System.Text;
56 using System.Net;
57 using System.Net.Sockets;
58 namespace SimpleUdpClient
59 {
60 class Program
61 {
62 static void Main(string[] args)
63 {
64 byte[] data = new byte[1024];//定义一个数组用来做数据的缓冲区
65 string input, stringData;
66 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
67 Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
68 string welcome = "Hello,are you there?";
69 data = Encoding.ASCII.GetBytes(welcome);
70 server.SendTo(data, data.Length, SocketFlags.None, ipep);//将数据发送到指定的终结点
71
72 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
73 EndPoint Remote = (EndPoint)sender;
74 data = new byte[1024];
75 int recv = server.ReceiveFrom(data, ref Remote);//接受来自服务器的数据
76
77 Console.WriteLine("Message received from{0}:", Remote.ToString());
78 Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
79 while (true)//读取数据
80 {
81 input = Console.ReadLine();//从键盘读取数据
82 if (input == "text")//结束标记
83 {
84 break;
85 }
86 server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//将数据发送到指定的终结点Remote
87 data = new byte[1024];
88 recv = server.ReceiveFrom(data, ref Remote);//从Remote接受数据
89 stringData = Encoding.ASCII.GetString(data, 0, recv);
90 Console.WriteLine(stringData);
91 }
92 Console.WriteLine("Stopping client");
93 server.Close();
94 }
95 }
96 }
97 (4)测试服务器与客户机
98 由于条件的限制,测试是在一台电脑上进行的。所以在客户机的定义中是将发送和接收信息的地址设置为本机的。
99 先启动服务器,在启动客户机,按照提示输入信息即可。

C#中UDP(Socket)的更多相关文章
- HTTP TCP UDP Socket 关系的几个经典图
从上图可以看到,TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. ...
- Windows UDP socket recvfrom返回10054错误的解决办法
现象: 在Windows 7系统上,A使用UDP socket,调用sendto函数向一个目标地址B发送数据,但是目标地址B没有接收数据,如果A此时立即调用recvfrom试图接收目标地址B发回的数据 ...
- Python中的socket 模块
Python 提供了两个基本的 socket 模块.第一个是 Socket,它提供了标准的 BSD Sockets API.第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务 ...
- QT中的SOCKET编程(QT-2.3.2)
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- UDP socket 设置为的非阻塞模式
UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct so ...
- 读懂Java中的Socket编程
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- 读懂Java中的Socket编程(转)
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...
- c#和UDP SOCKET广播
server: Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); // ...
- Linux中查看socket状态(转)
Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...
- Linux编程之UDP SOCKET全攻略
这篇文章将对linux下udp socket编程重要知识点进行总结,无论是开发人员应知应会的,还是说udp socket的一些偏僻知识点,本文都会讲到.尽可能做到,读了一篇文章之后,大家对udp so ...
随机推荐
- xcode 老项目library not found for -libstdc++.6.0.9
Xcode升级到Xcode10.0后,由于去掉陈旧的libstdc++库替换为libc++,libc++相对是苹果最新版的C++库,经过优化并全面支持C++11 下载libstdc++库,链接: ht ...
- mac被锁有pin码的解锁方法
停用规律: 错误5次密码停用1分钟 再错误3次停用5分钟 在错误1次就停用15分钟 再错误1次就是60分钟了,而且还没输入框了,这时候我们要通过按 option,commond这2个按钮来唤起输入框 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-6.微信扫码登录回调本地域名映射工具Ngrock
笔记 6.微信扫码登录回调本地域名映射工具Ngrock 简介:讲解微信扫码回调本地域名ngrock讲解 1.为什么要用这个,微信扫码需要配置回调,需要配置对应的域名 ...
- 手把手教你如何玩转Solr(包含项目实战)
一:Solr简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引 ...
- NLP基础
1 自然语言处理三大特征抽取器(CNN/RNN/TF)比较 白衣骑士Transformer:盖世英雄站上舞台 华山论剑:三大特征抽取器比较 综合排名情况 以上介绍内容是从几个不同角度来对RNN/CN ...
- java中图片地址base64编码的相互转换
public class Base64Url { /** * 将base64编码字符串转换为图片 * @param imgStr: base64编码字符串 * @param path: 图片路径-具体 ...
- Spring boot Gradle项目搭建
Spring boot Gradle项目搭建 使用IDEA创建Gradle工程 操作大致为:File->new->Project->Gradle(在左侧选项栏中) 创 ...
- LeetCode.1207-唯一的元素出现次数(Unique Number of Occurrences)
这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第269题(顺位题号是1207).给定一个整数数组arr,当且仅当该数组中每个元素的出现次数唯一时,返回tr ...
- 【Web网站服务器开发】Apache 和 Tomcat的区别及配置
Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. apache是web服 ...
- beam search 和 greedy search
贪心搜索(greedy search): 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search): 集束搜索可以认为是维特比算法的贪心形式,在 ...