【正点原子阿尔法 IMX6ULL Linux开发板】第12篇 TCP编程测试(Linux C编程)
[复制链接]
一 SOCKET基本概念
以下来源于《Linux高级程序设计》
Socket是实现网络主机进程间通信的一种机制,从用户空间来看,socket是一个文件描述符,对socket的操作等同于对普通的文件描述符的操作,即可以利用read write close等函数来操作,一旦针对该socket必要的初始化完成后,与对端的数据交互都是通过该socket实现的
例如
- 要向对方发送数据,只需要将数据write到该socket
- 要收数据,只要阻塞的在socket上读取数据即可。
TCP的实现流程图:
二、socket函数
大致看了下 其实和Python的TCP大差不差,Python提供了模块
C提供了库函数
#include <sys/socket.h>头文件
头文件里包含的库函数有:
函数原型
|
int socket(int domain, int type, int protocol)
|
函数传入值
|
domain
|
AF_INET:IPv4协议
|
AF_INET6:IPv6协议
|
AF_LOCAL:Unix域协议
|
AF_ROUTE:路由套接口
|
AF_KEY:密钥套接口
|
type
|
SOCKET_STREAM:双向可靠数据流,对应TCP
|
SOCKET_DGRAM:双向不可靠数据报,对应UDP
|
SOCKET_RAW:提供传输层以下的协议,可以访问内部网络接口,例如接收和发送ICMP报文
|
protocol
|
type为SOCKET_RAW时需要设置此值说明协议类型,其他类型设置为0即可
|
函数返回值
|
成功:socket文件描述符
|
失败:-1,失败原因存于error中
|
bind(将一个本地协议地址与socket文件描述符联系起来)
|
函数说明
|
将一个协议地址与socket文件描述符联系起来
|
函数原型
|
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
函数传入值
|
sockfd
|
socket文件描述符
|
addr
|
my_addr指向sockaddr结构,该结构中包含IP地址和端口等信息
|
addrlen
|
sockaddr结构的大小,可设置为sizeof(struct sockaddr)
|
函数返回值
|
成功:0
|
失败:-1,失败原因存于error中
|
listen (等待连接)
|
函数说明
|
等待连接
|
函数原型
|
int listen(int sockfd, int backlog)
|
函数传入值
|
sockfd
|
监听socket文件描述符
|
backlog
|
套接字排队的最大连接个数
|
函数返回值
|
成功:0
|
失败:-1,失败原因存于error中
|
特别说明
|
对于监听socket文件描述符sockfd,内核要维护两个队列,分别为未完成连接队列和已完成连接队列,这两个队列之和不超过backlog
|
connect(建立socket连接)
|
说明
|
建立socket连接
|
原型
|
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
|
传入值
|
sockfd
|
socket文件描述符
|
serv_addr
|
连接的网络地址和端口
|
addrlen
|
sockaddr结构的大小,可设置为sizeof(struct sockaddr)
|
函数返回值
|
成功:0
|
失败:-1,失败原因存于error中
|
函数
|
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
传入参数
|
sockfd: socket文件描述符
|
addrlen:addr的大小,可设置为sizeof(struct sockaddr)
|
传出参数
|
addr:填入远程主机的地址数据
|
函数返回值
|
成功:实际读取字节数
|
失败:-1,错误代码存放在error中
|
函数原型
|
int close(int sockfd)
|
传入值
|
sockfd:socket文件描述符
|
函数
返回值
|
成功:0
|
失败:-1,失败原因存于error中
|
三、程序编写
Socket地址的数据类型
Server程序
Client程序
四、测试:
Server.c 和client.c
如果哪个需要放在开发板上运行,需要进行交叉编译
编译命令:arm-linux-gnueabihf-gcc server.c -o server
开发板运行 ./server
Ububtu系统运行: ./client
忘记截图了,反正很简单
|