使用 Open Communication Wizard 建立开放式UDP 通信
- 格式:pdf
- 大小:732.68 KB
- 文档页数:9
简单描述开发udp程序的过程。
1. 创建UDP套接字:使用系统调用创建一个UDP套接字,该套接字将用于发送和接收UDP数据包。
2. 绑定端口:使用bind()函数将套接字绑定到一个特定的本地端口号,这样就能够接收到该端口号上的UDP数据包。
3. 接收UDP数据包:使用recvfrom()函数从绑定的套接字中接收UDP数据包。
可以通过设置缓冲区来确定可以接收的最大数据包大小。
4. 处理接收到的数据包:对于接收到的UDP数据包,可以根据需要进行处理。
可以在此处进行数据包解析、执行特定操作等。
5. 发送UDP数据包:使用sendto()函数将UDP数据包发送到指定的目标地址和端口号。
同样可以通过设置缓冲区来确定可以发送的最大数据包大小。
6. 关闭套接字:使用close()函数关闭UDP套接字,释放系统资源。
需要注意的是,UDP是无连接的协议,所以不需要进行连接的建立和断开。
在开发UDP程序时,还需要考虑网络延迟、数据包丢失等问题,并在代码中做相应的处理。
udp打洞原理
UDP打洞是一种网络技术,用于在防火墙或NAT设备后面的计算机之间建立直接通信连接。
UDP打洞依赖于UDP包的特性,通过向目标计算机发送UDP包并在其防火墙或NAT设备上创建映射,然后再从源计算机发送UDP包,并通过先前创建的映射将数据直接发送到目标计算机。
这种技术可以在没有使用中间服务器的情况下实现点对点通信,提高通信效率和速度。
UDP打洞的原理是利用网络中UDP协议的一些特性,如UDP包不需要建立连接、UDP包可以在不同的端口之间进行通信等。
在UDP打洞的过程中,源计算机和目标计算机都会发送UDP包,以便在对方的防火墙或NAT设备上创建映射。
这些映射允许UDP包从源计算机直接发送到目标计算机,从而达到点对点通信的目的。
UDP打洞需要满足以下条件才能实现:
1. 源计算机和目标计算机都有公网IP地址。
2. 源计算机和目标计算机都可以发送和接收UDP包。
3. 源计算机和目标计算机都可以通过防火墙或NAT设备向外部网络发送UDP包,并且可以接收来自外部网络的UDP包。
UDP打洞的实现需要注意以下问题:
1. 防火墙或NAT设备可能会阻止UDP包的传输,导致UDP打洞失败。
2. 需要防止恶意用户利用UDP打洞技术进行攻击。
UDP打洞是一种实现点对点通信的重要技术,可以提高通信效率
和速度。
在实际应用中,需要结合其他网络技术来保证通信的安全性和可靠性。
一:TCP 协议通讯(一)S7 200 SMART之间的TCP通讯TCP是一个因特网核心协议。
在通过以太网通信的主机上运行的应用程序之间,TCP 提供了可靠、有序并能够进行错误校验的消息发送功能。
TCP 能保证接收和发送的所有字节内容和顺序完全相同。
TCP 协议在主动设备(发起连接的设备)和被动设备(接受连接的设备)之间创建连接。
一旦连接建立,任一方均可发起数据传送。
TCP协议是一种"流"协议。
这意味着消息中不存在结束标志。
所有接收到的消息均被认为是数据流的一部分。
S7 200 SMART与之间的TCP通讯可以通过两边调用OUC(开放式用户通讯)指令库中的TCP_CONNECT、TCP_SEND、TCP_RECV、DISCONNECT指令来实现。
图1.开放式用户通讯库开放式用户通信库需要使用50 个字节的V 存储器。
开放式的用户通讯连接资源包括8个主动连接和8个被动连接。
只可从主程序或中断例程中调用库函数,但不可同时从这两个程序中调用。
所需条件:1、软件版本:STEP 7-Micro/WIN SMART V2.22、SMART CPU固件版本:V2.23、通讯硬件:TP电缆(以太网电缆)所完成的通讯任务:将作为客户端的PLC(IP地址为192.168.0.101)中VB0-VB3的数据传送到作为服务器端的PLC(IP地址为192.168.0.102)的VB2000-VB2003中。
S7-200 SMART 客户端编程1、设置本机IP地址在客户端设置IP地址为192.168.0.101图2.设置IP地址2、建立TCP连接调用TCP_CONNECT指令建立TCP连接。
设置连接伙伴地址为192.168.0.102,远端端口为2001,本地端口为5000,连接标识ID为1。
利用SM0.0使能Active,设置为主动连接。
图3.调用TCP_CONNECT指令指令的参数输入参数:EN :使能输入Req:沿触发Active :TURE=主动连接(客户端)FALSE=被动连接(服务器)ConnID:连接ID为连接标识符,可能范围为0-65534。
OpenSocket是一种UDP通信协议,它可以在网络中进行数据传输。
UDP是用户数据报协议,它可以快速传输数据包,但不具有TCP协议中的数据确认和重传功能。
OpenSocket是可以用来进行UDP通信的一种工具,它提供了一套API接口,可以让开发者方便地进行UDP通信。
一、UDP协议的特点UDP协议是一种面向无连接的协议,它不需要在发送数据之前进行连接的建立工作,也不需要在接收数据之后进行连接的释放工作。
这使得UDP协议可以实现更快速的数据传输,但也容易导致数据的丢失或乱序。
1. 数据传输快速由于UDP协议不需要进行连接的建立和释放,因此可以实现更快速的数据传输。
这使得UDP协议在一些对实时性要求较高的场景中有很好的应用前景,比如视瓶直播、语音通话等。
2. 数据可靠性较差UDP协议并没有TCP协议中的数据确认和重传功能,因此在数据传输过程中容易出现数据丢失或乱序的情况。
这使得UDP协议在一些对数据可靠性要求较高的场景中并不适用,比如文件传输、网页浏览等。
3. 数据报格式简单UDP协议的数据报格式比较简单,只包括了源端口、目的端口、长度和校验和等基本信息。
这使得UDP协议在协议头开销上比TCP协议要小,可以更加高效地利用网络带宽。
二、OpenSocket的特点OpenSocket是一种可以用来进行UDP通信的工具,它提供了一套API接口,可以让开发者方便地进行UDP通信。
OpenSocket的特点如下:1. 跨评台性OpenSocket可以在多种操作系统上运行,包括Windows、Linux、macOS等。
这使得开发者可以在不同的评台上使用相同的API接口进行UDP通信,方便了跨评台开发。
2. 简单易用OpenSocket提供了一套简单易用的API接口,可以让开发者方便地进行UDP通信。
开发者只需要调用相应的API接口,就可以实现数据的发送和接收,而不需要关心网络通信的细节。
3. 高性能OpenSocket在UDP通信性能上有着较好的表现,可以实现高效的数据传输。
使用Open Communication Wizard 建立开放式TCP 通信1. 概述介绍SIMATIC S7- PN CPU包含一个集成的PROFINET 接口,该接口除了具有PROFINET I/O功能外还具有TCP 通信功能。
通过该集成以太网接口组态TCP 通信时,只能使用开放式通信专用的功能块。
依据RFC793的TCP 协议,在STEP7”通讯块”的“标准库”(图1所示)中提供了下列FB,通过用户程序与符合以太网标准的通讯伙伴进行数据交换:• 用于分配连接参数的UDT 65 "TCON_PAR"• 用于建立连接的FB 65 "TCON"• 用于终止连接的FB 66 "TDISCON"• 用于发送数据的FB 63 "TSEND"• 用于接收数据的FB 64 "TRCV"图1解决方案要通过S7-PN CPU 的集成PROFINET 接口实现开放的TCP 通信,不能在硬件组态中完成,必须在一个数据块中指定每个连接的参数。
使用“Open Communication Wizard” 工具可以简单明了地指定连接参数,该工具可将一个包含所有参数的UDT 导出到您的STEP 项目中。
使用该UDT 可建立含有连接描述的数据块。
随后,需使用通信功能块FB65 "TCON"、FB66 "TDISCON"、FB63 "TSEND" 和FB64 "TRCV"完成程序的编写。
2. 系统配置CPU采用两个315-2PN/DP,使用以太网进行通信,网络拓扑如图2所示:图23. 配置OPEN Communication Wizard首先使用STEP7创建一个项目,名称为open_TCP_wizard,建立两个315PN/DP站。
安装并打开向导。
通过 S7-300 或 S7-400 CPU 集成工业以太网接口以 OPEN IE 的通信方式,怎样编写通讯块 FB67,FB68,FB65 和 FB66 实现 UDP 连接的通信程序?描述:可以通过集成的 PROFINET 接口使用 OPEN IE 的通信方式进行数据交换,下列通信协议支持数据交换:• TCP• ISO-on-TCP• UDP通过工业以太网 OPEN IE 通信方式下的UDP 协议进行数据交换,需要使用以下程序块。
• FB65 "TCON" 用于连接端点• FB66 "TDISCON" 用于断开端点• FB67 "TUSEND" 用于发送数据• FB68 "TURCV" 用于接收数据这些通信功能块可以在函数库 Standard Library -> Communication Blocks中找到. 用于连接 UDP 端点的参数存储于一个数据结构体中。
在这个例子中,数据结构体 UDT65 "TCON_PAR" 将被使用,用户将对这个数据结构体进行参数化。
不需要在 NetPro 中配置通信连接。
Note:通过工业以太网 OPEN IE 通信方式得到详细信息可以参考手册"System Software for S7-300/400 System and Standard Functions",登陆条目ID: 1214574.示例程序的描述S7 程序中包括 FB65 "TCON" 的调用及带有 UDP 连接端点参数的数据结构体 UDT65"TCON_PAR"。
S7 程序中还包含函数库 Standard Library -> Communication Blocks 中函数 FB67 "TUSEND" and FB68 "TURCV" 的调用,The FB67 "TUSEND" 用于将数据发送给一个 S7 站,一个PC 站或第三方系统。
如何实现UDP编程及通讯方式UDP 是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
UDP在IP报文的协议号是17。
在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP 仍然不失为一项非常实用和可行的网络传输层协议。
既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?主要的原因有两个。
一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP 传输的效率不如UDP高。
二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。
在选择使用协议的时候,选择UDP必须要谨慎。
在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。
但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
比如我们聊天用的ICQ和QQ就是使用的UDP协议。
UDP编程的服务器端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();* 可选3、绑定IP地址、端口等信息到socket上,用函数bind();4、循环接收数据,用函数recvfrom();5、关闭网络连接;UDP编程的客户端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();* 可选3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选4、设置对方的IP地址和端口等属性;5、发送数据,用函数sendto();6、关闭网络连接;UDP通讯服务器端源代码如下:#include<stdio.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<arpa/inet.h>int main(intargc, char **argv){structsockaddr_ins_addr;structsockaddr_inc_addr;int sock;socklen_taddr_len;intlen;char buff[128];/* 创建 socket , 关键在于这个 SOCK_DGRAM */if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket");exit(errno);} elseprintf("create socket.\n\r");memset(&s_addr, 0, sizeof(structsockaddr_in));/* 设置地址和端口信息 */s_addr.sin_family = AF_INET;if (argv[2])s_addr.sin_port = htons(atoi(argv[2]));elses_addr.sin_port = htons(7838);if (argv[1])s_addr.sin_addr.s_addr = inet_addr(argv[1]);elses_addr.sin_addr.s_addr = INADDR_ANY;/* 绑定地址和端口信息 */if ((bind(sock, (structsockaddr *) &s_addr, sizeof(s_addr))) == -1) { perror("bind");exit(errno);} elseprintf("bind address to socket.\n\r");/* 循环接收数据 */addr_len = sizeof(c_addr);while (1) {len = recvfrom(sock, buff, sizeof(buff) - 1, 0,(structsockaddr *) &c_addr, &addr_len);if (len< 0) {perror("recvfrom");exit(errno);buff[len] = '\0';printf("收到来自%s:%d的消息:%s\n\r",inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff); }return 0;}客户端源代码如下:#include<stdio.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<arpa/inet.h>int main(intargc, char **argv){structsockaddr_ins_addr;int sock;intaddr_len;intlen;char buff[128];/* 创建 socket , 关键在于这个 SOCK_DGRAM */if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {perror("socket");exit(errno);} elseprintf("create socket.\n\r");/* 设置对方地址和端口信息 */s_addr.sin_family = AF_INET;if (argv[2])s_addr.sin_port = htons(atoi(argv[2]));elses_addr.sin_port = htons(7838);if (argv[1])s_addr.sin_addr.s_addr = inet_addr(argv[1]);else {printf("消息必须有一个接收者!\n");exit(0);}/* 发送UDP消息 */addr_len = sizeof(s_addr);strcpy(buff, "hello i'm here");len = sendto(sock, buff, strlen(buff), 0, (structsockaddr *) &s_addr, addr_len); if (len< 0) {printf("\n\rsend error.\n\r");return 3;}printf("send success.\n\r");return 0;}编译程序用下列命令:gcc -Wall simple-udpserver.c -o servergcc -Wall simple-udpclient.c -o client运行程序用下列命令:./server 127.0.0.1 7838 启动服务器./client 127.0.0.1 7838 启动客户端如何实现UDP编程及通讯方式?看完以上内容,相信你可以学会。