tcp连接传输数据(建立tcp连接后收不到数据)

      最后更新:2022-11-15 07:37:50 手机定位技术交流文章

      tcp发送数据过程

      最简单形象地说,TCP协议依靠三次握手原则。即:客户端向服务器发出请求、服务器端同意客户端的请求、客户端向服务器端传输数据。
      tcp发送数据过程

      传输层协议(TCP, UDP)

      传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram Protocol)。为了简化问题说明,本课程以Telnet为例描述相关技术。设备支持通过Telnet协议和Stelnet协议登录。使用Telnet,Stelnet v1协议存在安全风险,建议你使用STelnet v2登录设备。为了简化问题说明,本课程以FTP为例来描述相关技术。设备支持通过FTP协议,TFTP以及SFTP传输文件。使用FTP,TFTP,SFTP v1协议存在风险,建议使用SFTP v2方式进行文件操作。TCP是一种面向连接的传输层协议,提供可靠的传输服务。TCP是一种面向连接的端到端协议。TCP作为传输控制协议,可以为主机提供可靠的数据传输。TCP需要依赖网络协议为主机提供可用的传输路径。TCP允许一个主机同事运行多个应用进程。每台主机可以拥有多个应用端口,没对端口号,源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为 0~1023 。比如:FTP,HTTP,Telnet,SNMP服务均使用知名端口。动态端口范围 1024~65535 ,这些端口号一般不会固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。TCP通常使用IP作为网络层协议,这是TCP数据被封装在IP数据包内。TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。TCP Header是由如上图标识一些字段组成,这里列出几个常用字段。注意:1)主机A(通常也叫客户端)发送一个标识了SYN数据段,标识期望与服务器A建立连接,此数据段的序列号(seq)为a;2)服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。3)主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文段的确认。TCP是一种可靠的,面向连接的全双工传输层协议。TCP连接的简历是一个三次握手的过程。TCP的可靠传输还提现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。确认技术的工作原理如下:目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。如图所示,主机A向服务器A发送TCP数据段,为描述方便假设每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1400+1=M+1500进行确认。另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。注意:上面说到,数据段 N+3 传输失败,那么第二次确认号M+1500,主机A会将N+3,N+4,N+5全部发送一次。TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制。为了方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。例子中:主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个字节之后,缓存区满,第4个数据段被丢弃。服务器以ACK3073(1024*3=3072)响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。主机在关闭连接之前,要确认收到来自对方的ACK。TCP支持全双工模式传输数据,这意味着统一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,一次在传输完毕后,两个方向的连接必须都关闭。TCP连接的建立是一个三次握手过程,而TCP连接的终止则要经过四次挥别。如图:1.主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。2.服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认。3.服务器A想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认好为a+1。4.主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。以上四次交互完成了两个方向连接的关闭。TCP断开连接的步骤,这个比较详细:https://blog.csdn.net/ctrl_qun/article/details/52518479UDP是一种面向无连接的传输层协议,传输可靠性没有保证。当应用程序对传输的可靠性要求不高时,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单,容易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接受到重复数据的情况。UDP头部仅占8个字节,传输数据时没有确认机制(注意,但是有校验和)。UDP报文分为UDP报文头和UDP数据区域两个部分。报头由源端口,目的端口,报文长度以及校验和组成。UDP适合于实时数据传输,比如语音和视频通信。相比TCP,UDP的传输效率更高,开销更小,但是无法保证数据传输可靠性。UDP头部的标识如下:1)16位源端口号:源主机的应用程序使用的端口号。2)16位目的端口号:目的主机的应用程序使用的端口号。3)16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度是8字节,所以字段的最小值为8。4)16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。使用UDP传输数据时,由应用程序根据需要提供报文到达确认,排序,流量控制等功能。主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网路径叨叨主机B。这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认,排序和流量控制等功能(也就是说UDP报文的到达确认,排序和流量控制是应用程序来确定的)。通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。UDP适合传输对延迟敏感的流量,如语音和视频。在使用TCP协议传输数据时,如果一个数据段丢失或者接受端对某个数据段没有确认,发送端会重新发送该数据段。TCP重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于延迟敏感的应用,少量的数据丢失一般可以被忽略,这是使用UDP传输能够提升用户的体验。总结:1.TCP头部中的确认标识位有什么作用呢?TCP报文头中的ACK标识位用于目的端对已接受到数据的确认。目的端成功收到序列号为x的字节后,会以序列号x+1进行确认。2.TCP头部中有哪些标识位参与TCP三次握手?在TCP三次握手过程中,要使用SYN和ACK标识位来请求建立连接和确认建立连接。
      传输层协议(TCP, UDP)

      TCP 连接详解

      1、先提出一个问题, 可以不进行三次握手直接往服务端发送数据包吗?是不可以的,也是可以的;1)不可以是因为现在的TCP连接标准和规范要求传输数据前先确认两端的状态,有一端状态不OK的话,发数据包有什么用呢;2)说可以是站在网络连接的角度,像 UDP 协议;2、TCP三次握手1)标志位、随机序列号和确认序列号是在数据包的 TCP 首部里面;2)几个状态是指客户端和服务端连接过程中 socket 状态;3)第一次握手,客户端向服务端发送数据包,该数据包中 SYN 标志位为 1,还有随机生成的序列号c_seq,客户端状态改为 SYN-SENT;4)第二次握手,服务端接收到客户端发过来的数据包中 SYN 标志位为 1,就知道客户端想和自己建立连接,服务端会根据自身的情况决定是拒绝连接,或确定连接,还是丢弃该数据包;拒绝连接,会往客户端发一个数据包,该数据包中 RST 标志位为 1,客户端会报 Connection refused;丢弃客户端的数据包,超过一定时间后客户端会报 Connection timeout;确定连接时会往客户端发一个数据包,该数据包中 ACK 标志位为 1,确认序列号 ack=c_seq+1,SYN 标志位为 1,随机序列号 s_seq,状态由 LISTEN 改为 SYN-RCVD;5)第三次握手,客户端接收到数据包会做校验,校验ACK标志位和确认序列号 ack=c_seq+1,如果确定是服务端的确认数据包,改自己的状态为 ESTABLISHED,并给服务端发确认数据包;6)服务端接到客户端数据包,会校验ACK标志位和确认序列号 ack=s_seq+1,改自己的状态为 ESTABLISHED,之后就可以进行数据传输了;7)建立连接时的数据包是没有实际内容的,没有应用层的数据;8)建立连接之后发起的请求数据包,每个数据包都会封装各层协议的头部信息,标志位ACK为1,其他标志位变动;9)网络进程间的通信,一台服务器内部的进程间通信不用这样;3、TCP 连接三次握手抓包1)Socket 在 linux 系统中是一种特殊的文件,因为 linux 系统的理念就是【一切皆文件】,是系统内核级的功能;2)以上定义比较具体,可以抽象来理解,是一个内核级的用于通信的功能层,包含一组接口函数,这些函数实际就是操作 socket 文件句柄文件描述符;一个 TCP 连接由四要素【源IP、源Port、目标IP、目标Port】唯一标识,也即 socket 由这四要素唯一确定;一个 TCP 连接的建立也就是客户端、服务端创建了相对应的一对 socket,客户端和服务端之间的通信也就是这对 socket 间的通信(物理层面是网卡在发送/接收比特流数据);3)一个服务与另一个服务建立连接,他们的端口是什么呢?客户端发出请求端口号是随机的,服务端是进程监听的端口号;2、socket 主要函数介绍1、进程通信,一个进程只有一个监听 socket,connect socket 是针对一个客户的一个连接的,有很多个; 2、connect 函数内部在发起请求前会找系统随机一个端口号; 3、连接建立后,客户端发起请求传输数据,服务端会直接交给 connect socket 处理,不会交给监听 socket 处理;4、监听 socket 在处理客户端请求时,如果此时其他客户端发请求过来,监听 socket 是没法处理的,此时系统会维护请求队列由 backlog 参数指定;全连接队列(completed connection queue)半连接队列(incomplete connection queue)Linux 内核 2.2 版本之前,backlog 的大小等于全连接队列和半连接队列之和;Linux 内核 2.2 版本之后,backlog 的大小之和全连接队列有关系:半连接队列大小由 /proc/sys/net/ipv4/tcp_max_syn_backlog 文件指定,可以开很大;全连接队列大小由 /proc/sys/net/core/somaxconn 文件和 backlog 参数指定,取两个中的最小值;tomcat acceptCount 就是配置全连接队列大小;3、socket 函数在建立连接和数据传输的大概使用情况4、TCP首部结构1)2的16次方等于 65536,所以系统中端口号的限制个数为 65536,一般1024以下端口被系统占用;2)标志位这里是 6 个,还有其他标志位的,只是这 6 个标志位常用;3)seq 序列号,ack 确认序列号,序列号在数据传输时分包用到。三次握手时 seq 序列号是随机的,没有实际意义;4)TCP 包首部后面接着的是 IP 包首部,再紧接着的是以太网包首部,其实都是加 0101010101 二进制位;几个常用标志位,首先一个标志位占一个 bit 位,只能是二进制中的 1 或 0;1)SYN,简写 S,请求标志位,用来建立连接。在TCP三次握手中收到带有该标志位的数据包,表示对方想与己方建立连接;2)ACK,简写【.】,请求确认/应答标志位,用于对对方的请求进行应答,对方收到含该标志位的数据包,会知道己方存在且可用。也会用在连接建立之后,己方发送响应数据给对方的数据包中;3)FIN,简写 F,请求断开标志位,用于断开连接。对方收到己方的含该标志位的数据包,就知道己方想与它断开连接,不再保持连接;4)RST,简写 R,请求复位标志位,因网络或己方服务原因导致有数据包丢失,己方接收到的数据包序列号与上一个数据包的序列号不衔接,那己方会发送含该标志位的数据包告诉对方,对方接收到含该标志位的数据包就知道己方要求它重新三次握手建立连接并重新发送丢失的数据包,一般断点续传会用到该标志位;还有就是如果对方发过来的数据错了,有问题,己方也会发送含该标志位的数据包;5)PSH,简写 P,推送标志位,表示收到数据包后要立即交给应用程序去处理,不应该放在缓存中,read()/write() 都有缓存区;6)URG,简写 U,紧急标志位,该标志位表示 tcp 包首部中的紧急指针域有效,督促中间层尽快处理;7)ECE,在保留位中;8)CWR,在保留位中;5、TCP 抓包1)服务端会根据自身情况,没有要处理的数据时会把第二次和第三次挥手合并成一次挥手,此时标志位 FIN=1 / ACK=1;2)MSL 是 Maximum Segment Lifetime 缩写,指数据包在网络中最大生存时间,RFC 建议是 2分钟;详细描述:1)客户端、服务端都可以主动发起断开连接;2)第一次挥手,客户端向服务端发送含 FIN=1 标志位的数据包,随机序列号 seq=m,此时客户端状态由 ESTABLISHED 变为 FIN_WAIT_1;3)第二次挥手,服务端收到含 FIN=1 标志位的数据包,就知道客户端要断开连接,服务端会向客户端发送含 ACK=1 标志位的应答数据包,确认序列号 ack=m+1,此时服务端状态由 ESTABLISHED 变为 CLOSE_WAIT;4)客户端收到含 ACK=1 标志位的应答数据包,知道服务端的可以断开的意思,此时客户端状态由 FIN_WAIT_1 变为 FIN_WAIT_2;(第一、二次挥手也只是双方交换一下意见而已)5)第三次挥手,服务端处理完剩下的数据后再次向客户端发送含 FIN=1 标志位的数据包,随机序列号 seq=n,告诉客户端现在可以真正的断开连接了,此时服务端状态由 CLOSE_WAIT 变为 LAST_ACK;6)第四次挥手,客户端收到服务端再次发送的含 FIN=1 标志位的数据包,就知道服务端处理好了可以断开连接了,但是客户端为了慎重起见,不会立马关闭连接,而是改状态,且向服务端发送含 ACK=1 标志位的应答数据包,确认序列号 ack=n+1,此时客户端状态由 FIN_WAIT_2 变为 TIME_WAIT;等待 2 个MSL时间还是未收到服务端发过来的数据,则表明服务端已经关闭连接了,客户端也会关闭连接释放资源,此时客户端状态由 TIME_WAIT 变为 CLOSED;也就是说 TIME_WAIT 状态存在时长在 1~4分钟;7)服务端收到含 ACK=1 标志位的应答数据包,知道客户端确认可以断开了,就立即关闭连接释放资源,此时服务端状态由 LAST_ACK 变为 CLOSED;SYN 洪水攻击(SYN Flood)是一种 DoS攻击(拒绝服务攻击),大概原理是伪造大量的TCP请求,服务端收到大量的第一次握手的数据包,且都会发第二次握手数据包去回应,但是因为 IP 是伪造的,一直都不会有第三次握手数据包,导致服务端存在大量的半连接,即 SYN_RCVD 状态的连接,导致半连接队列被塞满,且服务端默认会发 5 个第二次握手数据包,耗费大量 CPU 和内存资源,使得正常的连接请求进不来;
      TCP 连接详解

      怎么使用TCP向远端SERVER传输数据

      如何使用TCP向远端SERVER传输数据 (发送与接收) 1. 如何使用TCP向远端SERVER传输数据先要建立一个TCP连接.模块作为CLIENT向远程的SERVER发起一个TCP连接,要成功建立连接需要SERVER端为连接到INTERNET的一台PC,而且该PC的IP地址是公网的IP地址(可以用拨号的方式获得,如在PC局域网内部则无法建立连接),然后该PC运行我们的SERVER软件,这时就可以在模块端用AT命令与SERVER建立TCP连接(AT+CIPSTART="TCP","SERVER的IP地址","SERVER的端口号"),连接成功后会返回CONNECTOK.然后就可以用AT+CIPSEND发送数据到SERVER,若SERVER有数据,模块自动通过串口接收.要关闭TCP连接可用AT+CIPCLOSE命令.2. 如何使用UDP向远端SERVER传输数据先要注册一个UDP端口(AT+CIPSTART="UDP","SERVER的IP地址","SERVER的端口号"),成功后返回CONNECT OK.然后用AT+CIPSEND发送UDP包到SERVER,若SERVER有数据,模块自动接收,从串口送出.3. 如何发送数据要发送数据必须先要建立TCP连接或注册一个UDP连接.有3种方式发送数据.可变长度的数据发送可以用AT+CIPSEND命令,返回"$amp;>amp;$quot;后输入发送的数据,ctrl+z(0x1a)启动发送.固定长度的数据发送用AT+CIPSEND=LENGTH命令,返回"> "后输入发送的数据,当输入的数据长度等于LENGTH的时候自动发送,不需结束符.还有一种自动发送方式,先用AT+CIPATS=,命令设定自动发送的时间,然后用AT+CIPSEND返回"$amp;>amp;$quot;输入要发送的数据,等定时到了之后自动发送输入的数据.发送完成之后返回SEND OK.此时处于命令态,若有数据发送再重复以上的步骤就可以了.注意:每次发送的数据长度应小于1024bytes.4. 如何接收数据接收数据为自动接收,若有远端数据则自动接收.可以用AT+CIPHEAD=1在接收的数据前面自动加上标识.SIMCOM Application Note for SIM100 TCP/IP AT Commands45. 如何使用SIM100TCP的SERVER功能模块可以配置为TCPSERVER,接收来自远端的TCP数据.具体的操作如下:AT+CIPCSGP=1,"cmnet"(GPRS方式)AT+CLPORT="TCP","PORT" (设定侦听的TCP的端口号)AT+CIPSERVER (启动SERVER功能,成功后返回SERVER OK,这时候已经启动了SERVER功能,开始侦听PORT)AT+CIFSR (获得SERVER的IP地址)或者:AT+CIPCSGP=0,"17201","172","172", 2 (CSD方式,置为CSD连接,拨17201,用户名和密码皆为172,连接速率为9600)AT+CLPORT="TCP","PORT"(设定侦听的TCP端口号)AT+CIPSERVER(启动SERVER功能,成功后返回CONNECT 9600 和 SERVER OK,这时候已经启动了SERVER功能,开始侦听PORT)AT+CIFSR (获得SERVER的IP地址)可以用SMS通知远端模块本SERVER的IP地址和端口号,以便远端可以与之连接,收发数据.这时远端的模块就可以与本SERVER建立连接,收发数据了.如有CLIENT连接到SERVER,SERVER端会显示 REMOTE CLIENT的IP地址和端口号.这时候SERVER就可以接收来自REMOTE CLIENT的TCP数据包(不含TCP头)了.注意:目前TCP SERVER不能同时支持多个TCP连接.SIMCOM Application Note for SIM100 TCP/IP AT Commands56. 如何使用UDP,接收来自远端的数据可以使用SIM100TCP的UDP功能,接收来自远端的UDP数据.具体过程如下:AT+CIPCSGP=1,"cmnet"(GPRS方式)AT+CLPORT="UDP","端口号"(设置UDP端口号)AT+CSTT (启动TCP任务,成功后返回OK)AT+CIICR (激活场景,成功后返回OK)AT+CIFSR (获得本地IP地址)AT+CIPSTART="UDP","REMOTE IP ADDR","REMOTE PORT"(注册UDP连接,其中"REMOTE IP ADDR"和"REMOTE PORT"可以随便设置一个,成功后返回CONNECT OK)或者AT+CIPCSGP=0,"17201","172","172", 2 (CSD方式,置为CSD连接,拨17201,用户名和密码皆为172,连接速率为9600)AT+CLPORT="UDP","PORT"(设定UDP端口号)AT+CSTT (启动TCP任务)AT+CIICR (激活场景,成功后返回CONNECT 9600和OK)AT+CIFSR (获得本地IP地址)AT+CIPSTART="UDP","REMOTE IP ADDR","REMOTE PORT"(注册UDP连接,其中"REMOTE IP ADDR"和"REMOTE PORT"可以随便设置一个,成功后返回CONNECT OK)此时就模块就可以接收到远端的UDP包.可以用AT+CIPSRIP=1在收到的UDP包的前面加上标识和发送方的IP地址和端口号.SIMCOM Application Note for SIM100 TCP/IP AT Commands67. 如何使用DNS功能利用SIM100TCP的DNS可直接连接到一个域名,或者可以用DNS解析域名获得IP地址.具体步骤如下:直接连接到一个域名1:先配置DNSAT+CDNSCFG="211.136.18.171" (以上海为例)2:选择域名还是IP地址AT+CDNSORIP=1(选择域名)3:建立连接AT+CIPSTART="TCP","", "80" (连接到SERVER)4:发送数据AT+CIPSEND返回"$amp;>amp;$quot;后开始发送数据,ctrl+z启动发送.解析域名获得IP地址1:先激活一个移动场景AT+CSTTAT+CIICRAT+CIFSR2:配置DNSAT+CDNSCFG="211.136.18.171" (以上海为例)3:解析域名,获得IP地址AT+CDNSGIP=""返回该域名的IP地址8. 如何检测是否在线,断线后有什么提示可以用AT+CIPSTATUS查询TCP所处的状态,具体状态请参考AT命令集,若处于连接状态则返回CONNECTOK.断线后会主动返回CLOSE信息,同时TCP状态为IP CLOSE.9. 如何区分接收的数据是AT命令的响应还是来自远端设定AT+CIPHEAD=1,这样来自SERVER的数据前面就会自动加上一个标志,其格式为:+IPD(datalength),+IPD为标识,datalength为来自SERVER端数据的长度.这样就可以区分是来自SERVER的数据还是AT命令的相应.SIMCOM Application Note for SIM100 TCP/IP AT Commands710. 如何使用SIM100TCP建立点对点的TCP连接,传输数据用GPRS方式的具体步骤为:第一台:AT+CLPORT="TCP","3030"AT+CIPSERVER (启动SERVER功能,开始侦听3030端口)AT+CIFSR(获取本地IP地址)AT+CLPORT="TCP","3000"(设置本地TCP端口)第二台:AT+CLPORT="TCP","2020"AT+CIPSERVER (启动SERVER功能,开始侦听2020端口)AT+CIFSR(获取本地IP地址)AT+CLPORT="TCP","2000"(设置本地TCP端口)第一台:AT+CIPSTART="TCP","REMOTE IP ADDR","2020" (REMOTEIP ADDR可由对方发SMS得到)已经建立连接第二台:AT+CIPSTART="TCP","REMOTE IP ADDR","3030"已经建立连接之后任何一方就可以向另外一方发数据(用AT+CIPSEND发送)也可以用CSD方式建立,具体操作如下:第一台:AT+CIPCSGP=0,"17201","172","172", 2 (CSD方式,置为CSD连接,拨17201,用户名和密码皆为172,连接速率为9600)AT+CLPORT="TCP","3030"AT+CIPSERVER (启动SERVER功能,开始侦听3030端口)AT+CIFSR(获取本地IP地址)AT+CLPORT="TCP","3000"第二台:AT+CIPCSGP=0,"17201","172","172", 2 (CSD方式,置为CSD连接,拨17201,用户名和密码皆为172,连接速率为9600)AT+CLPORT="TCP","2020"AT+CIPSERVER (启动SERVER功能,开始侦听2020端口)AT+CIFSR(获取本地IP地址)AT+CLPORT="TCP","2000"SIMCOM Application Note for SIM100 TCP/IP AT Commands8第一台:AT+CIPSTART="TCP","REMOTE IP ADDR","2020" (REMOTEIP ADDR可由对方发SMS得到)已经建立连接第二台:AT+CIPSTART="TCP","REMOTE IP ADDR","3030"已经建立连接之后任何一方就可以向另外一方发数据(用AT+CIPSEND发送)SIMCOM Application Note for SIM100 TCP/IP AT Commands911. 如何使用SIM100TCP实现多个模块之间的互相通信目前SIM100TCP不支持多个TCP同时连接,但是可以用UDP方式来实现.可以用模块启动UDP功能,这样模快就可以接收来自远端的UDP包,可以通过收到的UDP包获取发送方的IP地址和端口号,然后本模块就可以作出应答,回应一个UDP包,实现相互的通讯.下面是一个简单的例子:假设A,B,C三个模块要相互通信,可以用以下的方式实现(以GPRS方式为例)1:A,B,C分别初始化如下:AT+CIPCSGP=1,"cmnet"(GPRS方式)AT+CLPORT="UDP","端口号"(设置UDP端口号)AT+CSTT (启动TCP任务,成功后返回OK)AT+CIICR (激活场景,成功后返回OK)AT+CIFSR (获得本地IP地址)AT+CIPSTART="UDP","REMOTE IP ADDR","REMOTE PORT"(注册UDP连接,其中"REMOTE IP ADDR"和"REMOTE PORT"可以随便设置一个,成功后返回CONNECT OK)2:若A要向B发送数据,只要这样就可以了:AT+CIPCLOSE (注销当前UDP连接)AT+CIPSTART="UDP","B的IP地址","B的端口号"(注册新的UDP连接)(成功后会返回CONNECTOK和OK)AT+CIPSEND (发送数据)若C有数据发给A,则A自动接收到,同时可以获得C的IP地址和端口号,这样A就可以发UDP包给C了,具体过程跟上面类似.SIMCOM Application Note for SIM100 TCP/IP AT Commands1012. TCP连接出错后应该如何处理若在建立TCP连接的过程中出现错误或者SERVER断线,则先用AT+CIPCLOSE关闭TCP连接(本地IP地址不变),然后再重新建立连接.若其他时候可以用AT+CIPSHUT关闭PDP Context(本地IP地址会改变),然后重新建立连接.13. 如何建立一个点对点的CSD连接首先要确保SIM卡已开通CSD业务,直接呼叫对方号码(数据呼叫,非语音呼叫),对方用ATA应答,然后会返回CONNECT 9600,这时候双方进入完全的透明数据传输状态,双方都可以收发数据,发+++后返回命令态(注意+++的前后0.5秒内必须无数据传输才能返回 命令态),ATO可返回数据态.ATH可结束本次CSD连接.
      怎么使用TCP向远端SERVER传输数据

      如何使用TCP向远端SERVER传输数据

      先要建立一个TCP连接.模块作为CLIENT向远程的SERVER发起一个TCP连接,要成功 建立连接需要SERVER端为连接到INTERNET的一台PC,而且该PC的IP地址是公网的IP地址(可以用拨号的方式获得,如在PC局域网内部则无法建立连接),然后该PC运行我们的SERVER软件,这时就可以在模块端用AT命令与SERVER建立TCP连接(AT+CIPSTART="TCP","SERVER的IP地址","SERVER的端口号"),连接成功后会返回CONNECTOK.然后就可以用AT+CIPSEND发送数据到SERVER,若SERVER有数据,模块自动通过 串口接收.要关闭TCP连接可用AT+CIPCLOSE命令.
      如何使用TCP向远端SERVER传输数据

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/45592.html

          热门文章

          文章分类