迅为iTOP-i.MX6ULL开发板-网络通信-套字节TCP
本章节使用的资料已经放到了开发板网盘资料中,路径为:“11_Linux 系统开发进阶\77_章节_网络通信-套字节 TCP 使用资料”。
iTOP-IMX6ULL 实现基于 TCP 的 socket 编程。
在 linux 下,网络资源非常丰富,底层的东西不需要去管,只需要知道怎么实现最终需要的功能即可。
77.1 实验操作
TCP 是一种面向连接的、可靠的、基于 IP 的传输层协议。通过 TCP 可以保证传送的数据的正确性。
Linux 下网络通信程序基本上都是采用 socket 的方式。socket 起源于 Unix,而 Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开 open->读写 read/write->关闭 close”模式来操作。Socket 就是该模式的一个实现,socket 即是一种特殊的文件,一些 socket 函数。就是对其进行的操作(读/写 IO、打开、关闭)。说白了 socket 是应用程序与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。现在看一下基于 TCP/IP 应用程序通信的流程,如图 77.1.1。
通过上图可以看到 TCP/IP 通信是基于服务器/客户端的模式来实现的,首先是服务器(server)端调用socket 函数创建一个套接字,然后调用 bind 绑定函数,绑定函数主要是设置通信时使用哪种地址族(IPv4,IPv6 等),使用的端口号。然后调用 listen 函数来监听客户端的连接请求。
现在来看下客户端(client)端的流程,首先调用 socket 函数创建一个套接字,然后调用 connect 函数连接服务器,这时服务器端的 listen 函数监听到客户端的连接请求就会调用 accept 函数去接受请求,这样连接就建立好了。之后双方就可以调用 read/write 函数收发数据了,在完成通信以后服务器(server)和客
户端(client)调用 close 函数关闭创建的套接字。
下面来看一个实现 TCP/IP 的通信的例子,首先来看一下服务器(server)端的代码:
程序首先是包含一些需要用到的头文件,然后是 main 主函数,在 main 函数里面首先是定义了一些变量,然后调用 socket 函数创建一个套接字,socket 函数的第二个参数是 SOCK_STREAM,表示创建的是TCP 连接。然后调用 bzero 函数把变量 s_add 清零,然后给 s_add 结构里面的变量赋值:
然后调用 bind 绑定函数,使用的是 IPv4 协议族,然后调用 listen 监听函数,监听用户的连接请求。在监听到用户的请求后调用 accept 函数接受请求,然后进入到循环发送的代码,会循环发送“hello,welcometo my server”+发送次数号,最后会调用 close 关闭套接字。
下面来看看客户端(client)端的代码:
首先是包含一些需要的头文件,然后进入 main 主函数定义了一些变量,然后调用 socket 函数创建套接字,然后调用 bzero 函数把变量 s_add 清零,然后给 s_add 结构里面的变量赋值:
然后调用 connect 函数来连接服务器(server),在连接成功后,就进入了循环接收函数,使用 read 函数接收服务器发送的数据。最后会调用 close 函数关闭套接字。
下面来编译下这两个程序,服务器(server)的程序运行在虚拟机 Ubuntu 上,所以使用下面的命令编译:
gcc -o server server.c
这样就生成了 server 可执行文件,客户端(client)的程序运行在 iTOP-IMX6UL 开发板上,使用下面的命令编译:
arm-none-linux-gnueabi-gcc -o client client.c
这样就生成了 client 可执行程序,把 client 下载到 iTOP-IMX6UL 开发板上,现在开始运行这两个程序,首先在虚拟机 Ubuntu 上运行 serevr 程序,如图 77.1.2。
可以看到 server 打印出来的运行信息,现在 server 运行到了 listen 函数开始监听客户端的连接。下面在 iTOP-IMX6ULL 开发板上运行 client 程序(因为我把 client 下载到了/bin 目录下,所以先进入到/bin 目录)执行下面的命令:
./client 192.168.1.77
上面命令里面的 192.168.1.77 是虚拟机 Ubuntu 的 IP 地址,看到程序连接成功,首先看一下虚拟机Ubuntu 上的 server 打出的信息,如图 77.1.3。
可以看到上图中 server 打印出了客户端的 ip 地址和端口号“Server start get connectfrom 0xc0a801e6 :0xe171”。
然后看一下 iTOP-IMX6UL 开发板串口的打印信息,如图 77.1.4。
通过上图可以看到打印连接成功“connect ok !”,然后串口会一直打印
read ok
REC:
hello,welcome to my server(0)
至此,基于 TCP/IP 的 socket 网络编程就已经完成了。