一,查看while源代码
1.TCP协议
TCP协议全称: 传输控制协议, 是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。顾名思义, 就是要对数据的传输进行一定的控制.旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
2.嵌套字
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
3.调用函数
(1)int socket(int domain, int type,int protocol)
socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况
(2)int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
(3)int listen(int sockfd,int backlog)
(4)int accept(int sockfd, struct sockaddr *addr,int *addrlen)
bind,listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-1
connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.
二,编译并在ubuntu运行
编译
gcc -o server-while-tcp.out server-while-tcp.c
gcc -o client.out client.c
运行
./server-while-tcp.out
三,修改服务器为多线程模式
1.优势 (1).多线程发送数据,即一个服务器对应多个客户端,最多可以同时监听10个客户端。
(2).客户端向服务器发起连接请求,成功后打印连接信息。
(3).客户端向服务器发送数据后,服务器端打印数据。
(4).服务器将得到的数据全部转换为大写后返回到客户端。
(5).客户端打印出从服务器端返回的数据。
2,server(服务器端)源码
./client.out 192.168.1.*** //新的窗口打开
3.client代码
4.编译运行
gcc -o srv srv.c
gcc -o cli cli.c
./srv
./cli 192.168.1.*** //新的窗口打开
四,使用${CROSS_COMPILE}编译各个程序
1.参考https://www.cnblogs.com/jackyim/p/3553824.html
2.配置
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/suliu/qemu/100ask/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
3.编译
arm-linux-gnueabihf-gcc -o server.o server.c //arm下运行的程序
arm-linux-gnueabihf-gcc -o client.o client.c
gcc -o server.o server.c //ubuntu下运行的程序
gcc -o client.o client.c
在开发板内mount nfs,并运行各个程序;理解运行状态
主机需要安装nfs
服务器端(ubuntu主机)
创建根目录和共享挂载点
sudo mkdir -p /srv/nfs4/www
将挂载目录绑定到共享挂载点
sudo mount --bind /home/suliu/Desktop/tcp/ /srv/nfs4/www
导出文件系统
打开/etc/exports文件
sudo vim /etc/exports
添加以下行
/srv/nfs4 127.0.0.1(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
/srv/nfs4/www 127.0.0.1(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
保存文件并导出共享
sudo exportfs -ar
查看当前活动的导出及其状态
exportfs -v
/srv/nfs4 127.0.0.1(rw,async,wdelay,nohide,insecure,no_root_squash,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash)
/srv/nfs4/www 127.0.0.1(rw,async,wdelay,nohide,insecure,no_root_squash,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash)
在服务器端执行下面命令,强制重新读取/etc/exports文件
[root@localhost log]# exportfs -ra
[root@localhost log]# exportfs
客户端(开发板)
4.运行
cd /home/suliu/qemu/ubuntu-18.04_imx6ul_qemu_system
./qemu-imx6ull-gui.sh
(1)登录
(2)查看
ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.133 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::d8af:2afa:14a3:d96f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:64:d3:91 txqueuelen 1000 (Ethernet)
RX packets 80442 bytes 77555991 (77.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40343 bytes 7869307 (7.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 31049 bytes 3439747 (3.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31049 bytes 3439747 (3.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.挂载
将主机上的/srv/nfs4/www挂载到开发板的/root/mnt/下mount -t nfs -o nolock,vers=4 10.0.2.2:srv/nfs4/www /root/mnt/
5.查看
df -h
cd /mnt/
ls 3.
6.运行程序(开发板做客户端,主机做服务器
#服务器(ubuntu)执行.out文件(gcc)
book@book-virtual-machine:/srv/nfs4/www$ ./server.out
#客户端(ubuntu)执行.o文件(arm-linux-gnueabihf-gcc)
[root@qemu_imx6ul:~/mnt]# ./client.o 10.0.2.2
注:退出程序时,先退出客户端,再退出服务器,以免再次启动时连接失败。(有时服务器退出后需要等待30s-5min才能再次运行
7.echo sever
由于我们之前已经实现了多线程的通信,这里给server.c程序加上一个send,直接将缓存区的数据原封不动的发送给客户端即可;再给客户端加上一个accpt函数,并将收到的数据打印出来即可。
8.echo大写