981|1

7172

帖子

195

TA的资源

五彩晶圆(高级)

楼主
 

【正点原子阿尔法 IMX6ULL Linux开发板】第12篇 TCP编程测试(Linux C编程) [复制链接]

 

一 SOCKET基本概念

以下来源于《Linux高级程序设计》

Socket是实现网络主机进程间通信的一种机制,从用户空间来看,socket是一个文件描述符,对socket的操作等同于对普通的文件描述符的操作,即可以利用read write close等函数来操作,一旦针对该socket必要的初始化完成后,与对端的数据交互都是通过该socket实现的

例如

  1. 要向对方发送数据,只需要将数据write到该socket
  2. 要收数据,只要阻塞的在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

忘记截图了,反正很简单

最新回复

好东西,学习一下。   详情 回复 发表于 2023-6-29 16:02
点赞 关注

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

好东西,学习一下。

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表