首页 > 系统相关 >Linux应用编程——TCP实现文件传输

Linux应用编程——TCP实现文件传输

时间:2024-07-31 09:24:54浏览次数:15  
标签:struct int 文件传输 TCP 入参 地址 Linux 返回值 接字

1、常用编程接口

1.1 socket函数

创建一个套接字

int socket(int domain, int type, int protocol);
  • 入参
    • domain:协议族,如AF_INET表示IPv4。
    • type:套接字类型,如SOCK_STREAM表示TCP套接字。
    • protocol:协议,一般为0。
  • 返回值
    • 成功时返回新创建的套接字的文件描述符,失败时返回-1。

1.2 bind函数 

将套接字绑定到一个IP地址和端口上

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 入参
    • sockfd:套接字文件描述符。
    • addr:指向struct sockaddr_in结构体的指针,包含IP地址和端口信息。
    • addrlenaddr结构体的长度。
  • 返回值
    • 成功时返回0,失败时返回-1。

1.3 listen函数

监听来自客户端的连接请求

int listen(int sockfd, int backlog);
  • 作用:开始监听来自客户端的连接请求。
  • 入参
    • sockfd:套接字文件描述符。
    • backlog:最大连接数。
  • 返回值
    • 成功时返回0,失败时返回-1。

1.4 accpt函数

接受客户端的连接请求,返回一个新的套接字用于通信

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 入参
    • sockfd:套接字文件描述符。
    • addr:指向struct sockaddr_in结构体的指针,用于存储客户端地址信息。
    • addrlenaddr结构体的长度。
  • 返回值
    • 成功时返回新的套接字文件描述符,失败时返回-1。

1.5 send函数

发送数据到套接字

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • 入参
    • sockfd:套接字文件描述符。
    • buf:指向要发送数据的缓冲区。
    • len:要发送的数据长度。
    • flags:发送标志,一般为0。
  • 返回值
    • 成功时返回发送的字节数,失败时返回-1。

 1.6 recv函数

从套接字接收数据

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • 入参
    • sockfd:套接字文件描述符。
    • buf:用于存储接收数据的缓冲区。
    • len:要接收的数据长度。
    • flags:接收标志,一般为0。
  • 返回值
    • 成功时返回接收的字节数,连接关闭时返回0,失败时返回-1。

 1.7 inet_ntop函数

将网络地址转换为点分十进制格式的字符串表示

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  • 入参
    • af:地址族(Address Family),指定地址的类型,常用的有AF_INET(IPv4)和AF_INET6(IPv6)。
    • src:指向存放网络地址的结构体的指针。
    • dst:指向存放转换后点分十进制字符串的缓冲区指针。
    • size:缓冲区的大小。
  • 返回值
    • 成功时返回指向转换后点分十进制字符串的指针(即dst的值)。
    • 失败时返回NULL,并设置errno来指示错误原因。

1.8 inet_pton函数

将点分十进制的字符串转换为网络地址的二进制表示

int inet_pton(int af, const char *src, void *dst);
  • 入参
    • af:地址族,可以是 AF_INET 表示 IPv4 或 AF_INET6 表示 IPv6
    • src:待转换的点分十进制格式的 IP 地址字符串
    • src:待转换的点分十进制格式的 IP 地址字符串
  • 返回值
    • 如果转换成功,返回值为 1
    • 如果传入的地址族不支持或转换失败,返回值为 0
    • 如果出现错误,返回值为 -1

1.9 getdaarinfo函数

根据主机名称和服务名获取地址信息

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
  • 入参
    • node:主机名或 IP 地址字符串
    • service:服务名或端口号字符串
    • hints:一个指向 struct addrinfo 结构的指针,指定地址解析的参数
    • res:一个指向 struct addrinfo 结构的指针,用于存储解析后的地址信息链表
  • 返回值
    • 如果解析成功,返回值为 0
    • 如果出现错误,返回值为非零值,可以通过 gai_strerror 函数获取错误信息

1.10 getnameinfo函数

根据地址信息获取主机名和服务名 

int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags);
  • 入参
    • sa:指向 struct sockaddr 结构的指针,包含了套接字地址信息
    • salen:套接字地址结构的长度
    • host:用于存储主机名的缓冲区
    • hostlen:主机名缓冲区的大小
    • serv:用于存储服务名的缓冲区
    • servlen:服务名缓冲区的大小
    • flags:控制解析行为的标志
  • 返回值
    • 如果转换成功,返回值为 0
    • 如果出现错误,返回值为非零值,可以通过 gai_strerror 函数获取错误信息

1.11 inet _addr函数

将点分十进制的字符串转换为IPV4地址的二进制表示 

in_addr_t inet_addr(const char *cp);
  • 入参
    • cp:指向点分十进制格式 IPv4 地址字符串的指针
  • 返回值
    • 如果转换成功,返回值为 32 位 IPv4 地址的网络字节顺序表示
    • 如果传入的字符串格式不正确,返回值为 INADDR_NONE(通常为 -1),表示转换失败

 1.12  memset函数

将一块内存空间的每个字节都设置为指定的值

void *memset(void *s, int c, size_t n);

  • 入参
    • *s:指向要填充的内存块的指针,作用是告诉函数要填充的一块空间的起点在哪
    • c:要填充的值,通常是一个无符号字符,它的作用是告诉函数这块空间要填充成哪个值
    • n:表示要填充的字节数,作用是告诉函数一共需要将多少个字节的空间设置成要填充的值.

  • 返回值
    • 类型是void*(无类型指针),作用是在函数运行结束后返回这块空间的起始地址

2、实现重点

1.怎么将文件名和文件内容发送过去

可以通过结构体将文件进行打包,打包发送过后再对结构体里的信息进行解析。

/*文件信息*/
typedef struct FileMess{
    unsigned long fileLen;
    char fileName[100];
} FileMess;


/*数据包*/
typedef struct DataPack{
    char type;     //'D'表示数据,'M'表示文件信息, 'E'表示错误数据包
    int packSize;   //数据包的大小
    char content[MAXBUFF];  //存放数据
    int contentLen;     //数据的长度
    unsigned long position;    //数据在文件中的位置
    FileMess fileMess;      //文件信息
} DataPack;

2.read每次只能读取一个字节,接收到之后怎么写入。

使用lseek(),重定向到上次写入字节的后边

lseek(fd, recvedCount, SEEK_SET);//重定向
            write(fd, dataPack->content, dataPack->contentLen);
            recvedCount += dataPack->contentLen;

3.实现效果

服务器端

客户端 

标签:struct,int,文件传输,TCP,入参,地址,Linux,返回值,接字
From: https://blog.csdn.net/m0_75183905/article/details/140789375

相关文章

  • TCP
    packagecom.itheima.threadpool;importjava.io.*;importjava.net.Socket;publicclassClientDemo{publicstaticvoidmain(String[]args)throwsIOException{Socketsocket=newSocket("127.0.0.1",10000);//是本地的流,用来读取本地文......
  • Linux基本功能
    Linux操作系统,作为开源社区的明星之一,以其稳定性、安全性和灵活性在全球范围内得到广泛应用。1.多用户和多任务支持Linux是一个真正的多用户系统,允许多个用户同时登录并在同一时间内运行多个程序。每个用户拥有自己的账户和权限,这使得Linux在服务器环境中尤为受欢迎。通......
  • TCP为什么需要四次挥手?
    tcp为什么需要四次挥手?答案有两个:1.将发送fin包的权限交给被动断开方的应用层去处理,也就是让程序员处理2.接第一个答案,应用层有了发送fin的权限,可以在发送fin前继续向对端发送消息为了搞清楚这个问题,我们先要了解四次挥手的过程:1.注意事项tcp四次挥手过程中没有客户......
  • 【调试笔记-20240730-Linux-OpenWrt 23.05 安装 Docker 配置 bitnami/Wordpress-with-
    调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现微信用户在线注册登录文章目录调试笔记-系列文章目录调试笔记-20240730-Linux-OpenWrt23.05安装Docker配置bitnami/Wordpress-with-NGINX实现......
  • Arch Linux KDE Plasma 显示和字体调整
    安装主题和图标yay-Sadapta-kde-gitpapirus-icon-theme-git去设置里选择字体安装1、下载字体:sudopacman-Sxx#安装字体sudofc-cache-fv#刷新缓存#字体文件目录:/usr/share/fontsadobe-source-sans-fonts#思源SourceSansPro英文字体adobe-source-code-p......
  • 【Linux】信号的保存和捕捉
    信号的保存和捕捉信号的保存与信号相关的常见概念信号在内核中的表示信号集操作函数sigset_tsigprocmasksigpending信号的捕捉信号什么时候被处理?内核如何实现信号的捕捉sigaction补充SIGCHLD信号可重入函数信号的保存与信号相关的常见概念实际执行信号的处理动......
  • Linux C++ 开发1 - 搭建C++开发环境
    1.安装GCC/GDB1.1.安装1.2.校验2.安装CMake2.1.安装2.2.校验3.安装IDE3.1.VSCode3.2.CLion1.安装GCC/GDB1.1.安装#更新软件源sudoaptupdate#通过以下命令安装编译器和调试器sudoaptinstallbuild-essentialgdbUbuntu默认情况下没有......
  • linux lvm 安全 删除 硬盘或分区
    lvm的逻辑卷,可能由一个或者多个硬盘或者分区组成,如何才能安全的删除逻辑卷中的硬盘或者分区呢。适用场景,我有二块小硬盘,我想把其中一块小的硬盘换成大的。首先就要把逻辑卷中的小硬盘,安全的删除掉。下面是操作的详细过程。1,查看分区情况[root@testdata]#df-h Filesyste......
  • 大厂linux面试题攻略四之Linux网络服务(二)
     五、Linux网络服务-Apache优化1.请写出工作中常见的Apache优化策略Apache服务器优化是提升网站响应速度和稳定性的重要手段。在工作中,常见的Apache优化策略包括以下几个方面:1.启用压缩技术Gzip压缩:使用Gzip压缩技术可以减少服务器传输的数据量,从而提高网页加载速度。Gzi......
  • 在Linux系统中使用Nginx部署Vue2项目
    1、打包Vue项目,命令如下:npmrunbuild打包成功后,会生成一个dist目录,dist目录中的所有文件需要上传到服务器上。2、修改dist目录中的index.html(看情况省略此步)主要看css、js等文件的路径,例如以下情形:默认:<linkhref="/js/chunk-vendors.ebc2055a.js"rel="preload"as=......