今天给大家介绍的是以太网控制网络单片机W7100A的应用笔记之如何实现TCP通信。
TCP(传输控制协议)是用于控制网络间数据通信的协议。作为组成互联网的主要协议之一,更多的详细内容已经写入IETF(互联网工程任务组)的RFC 793中。TCP是运行于IP层上的协议,它保证了数据的有效传输并且可以按照数据的发送顺序依次进行接收。
因为W7100A单片机支持传输层的TCP协议,所以用户不需要做任何整合就可以直接使用TCP/IP协议。
下面一一给大家做阐述。
1 TCP SOCKET
用户可以在W7100A提供的所有8个SOCKET中使用TCP协议,但是必须首先创建要使用的SOCKET。在创建SOCKET时,需要用到SOCKET号、协议、端口号以及标志位。这篇文档将会介绍什么是TCP协议,以及在使用TCP协议时如何将Sn_MR(TCPIP核心中的SOCKET n模式寄存器)设置为Sn_MR_TCP(0×01)。SOCKET号表示用户可以选择从0到7这8个SOCKET中的任意一个使用。端口号表示TCP协议下用户指定使用的端口。如果上面需要的这些都已经设定好,那么socket()函数就可以自行分配创建一个SOCKET。
由于W7100A单片机的TCP协议支持服务器模式和客户端模式,用户可以任意选择一个模式实现此应用。服务器模式和客户端模式的不同见下图:
<图1.1> TCP 服务器和TCP 客户端
如图1.1所示,TCP服务器模式和客户端模式的过程大致相同。唯一的区别在于打开SOCKET之后,SOCKET状态是监听还是连接。当TCP协议在服务器模式下运行时,服务器处于监听状态等待来自客户端的连接请求。如果TCP协议运行于客户端模式下,客户端将会在连接状态下请求连接服务器。一旦成功建立连接,SOCKET的状态将会变成建立(SOCK_ESTABLISHED,0×17)。SOCKET在点对点建立连接之后仍然可以保持连接状态,从而进行数据交换直到SOCKET关闭。
服务器模式下的SOCKET循环周期是由打开、监听、发送、接收、断开和关闭组成。客户端模式的SOCKET循环周期则是由打开、连接、发送、接收、断开和关闭组成。
1.1 打开(OPEN)
无论是在服务器模式或是客户端模式下,在创建SOCKET时第一步都是打开SOCKET。利用SOCKET()函数设置SOCKET号、协议、端口号以及标志位来创建一个SOCKETn(取第n-1个SOCKET值)。由于使用的是TCP协议,需要将协议设置为Sn_MR_TCP(0×01)。而端口号的设置则取决于是在服务器模式还是客户端模式下。如果是在服务器模式下,服务器会根据当前用户所使用的端口来设置源端口号。但是如果是在客户端模式下,因为目的端口号正在被使用,最好随机选择一个端口号,并每次增加一个数字,直到SOCKET被连接为止。TCP协议的标志位表示‘无延时确认标志位’,一般来说,将该位设置为0。更多关于协议类型、标志位等信息,将会在‘TCPIPCore.h’文件下的‘Sn_MR value’中介绍。
在所有的设置完成之后,通过检查Sn_SR(n)寄存器来查看SOCKETn的状态是否变成SOCK_INIT(0×13)。用户可以通过getSn_SR(SOCKETn)函数来完成Sn_SR(N)寄存器的检查过程。如果SOCKET的状态为SOCK_INIT(0×13),表示SOCKET创建成功;如果没有成功,用户需要重新创建SOCKET。
例1.1 打开SOCKET
1.2 监听(LISTEN)
监听过程只能在服务器模式下使用。在SOCKETn创建完成后,为了能与客户端连接,需要将SOCKET的状态从SOCK_INIT(0×13)变成监听。用户可以直接将Sn_CR(n)寄存器设置为Sn_CR_LISTEN(0×02)或者可以直接使用’SOCKET.c’文件中的LISTEN()函数。在变成监听状态之后,SOCKET将会改变为SOCK_LISTEN(0×14)。然后,SOCKET等待客户端发出连接请求。一旦与客户端建立连接,SOCKET的状态将会重新变成SOCK_ESTABLISHED(0×17)。此时,便可以与客户端之间进行数据传输。
例 1.2 设置监听状态
1.3 连接(CONNECT)
连接过程发生在客户端模式连接到服务器时。在连接SOCKET时需要用到SOCKET号、目的IP以及目的端口号这些参数。用户可以通过CONNECT()函数进行设置;一旦成功建立连接,SOCKET的状态将会变成SOCK_ESTABLISHED(0×17)。
例 1.3 设置连接状态
1.4 发送(SEND)
在使用TCP协议时,与对端的连接在发送数据前就已经完成。用户可以通过SEND()函数查看设置的SOCKET号、将要发送数据的地址、数据的大小等参数。将要发送的数据的地址通常由选择的区域确定,输入数据,并且通过指针设定区域。
例1.4 发送数据
1.5 接收(RECEIVE)
接收过程和发送过程基本相同,唯一不同的是接收(RECEIVE)过程需要检查的是Sn_RX_RSR(n)。接收过程是指将来自接收缓存器的数据移动到用户数据存储区。因此,用户必须在接收之前检查Sn_RX_RSR(n)的值是否大于0。如果大于0,表示数据已经保存在接收缓存器中。用户必须通过getSn_RX_RSR(n)函数在此过程之前确认数据是否被接收。
例1.5 接收数据
1.6 断开(DISCONNECT)
关闭SOCKET的方法通常有两种:第一种方法是通过DISCONNECT(n)函数。DISCONNECT(n)函数不能用来直接关闭SOCKET。它先向对端发送断开连接请求(FIN数据包),然后等待回复信息(FIN/ACK数据包),之后才能将SOCKET的状态变成SOCK_CLOSED(0×00),最后关闭SOCKET。当收到断开连接请求时,W7100A发送一个FIN/ACK数据包表示允许对端关闭SOCKET。如果在发送断开连接请求之后没有收到对端的回复,将会发生TCP超时,SOCKET的状态将会变成SOCKET_CLOSED(0×00)。当用户需要断开连接时,通过DISCONNECT()函数,选择合适的SOCKET号,然后发送断开连接请求。
例1.6 设置断开连接
1.7 关闭(CLOSE)
和断开的过程不同,关闭过程可以直接将SOCKET变成SOCK_CLOSED(0×00)。用户通过
CLOSE(n)函数选择合适的端口号,然后无论对端有没有做出响应都将关闭SOCKET。如果RST数据包来自对端,SOCKET将会无条件变成SOCK_CLOSED(0×00)。一旦SOCKET变成为SOCK_CLOSED(0X00), SOCKET将不再可用除非重新打开它。
...
继续阅读请参考:http://blog.iwiznet.cn/?p=1583
更多参考资料请访问官网,有任何问题请随时联系我们。谢谢阅读!
文章评论(0条评论)
登录后参与讨论