编写程序实现利用TCP实现文件的发送

这篇具有很好参考价值的文章主要介绍了编写程序实现利用TCP实现文件的发送。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.通信流程
      发送端:                                              接收端:
      socket                                                socket 
                                                                 bind 
                                                                 listen
      connect                                              accept 
      send                                                   recv 
      close                                                  close 

2.函数接口
      (1) listen 
      int listen(int sockfd, int backlog)
      功能:
        监听三次握手连接
      参数:
        sockfd: 
套接字文件描述符
        backlog: 尚未处理的连接请求最大等待个数
      返回值:
        成功返回0 
        失败返回-1 

      注意:
        1.listen不会阻塞

      (2) accept
      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
      功能:
        处理等待队列中的第一个请求
      参数:
        sockfd: 套接字文件描述符
        addr: 存放请求方地址信息空间首地址
        addrlen: 请求方地址信息长度
      返回值:
        成功返回新的文件描述符
        失败返回-1 

      (3) recv 
      ssize_t recv(int sockfd, void *buf, size_t len, int flags);
      功能:
        接收数据
      参数:
        sockfd: 套接字文件描述符
        buf: 存放接收到的数据空间首地址
        len: 最大接收字节数
        flags: 属性 默认为0 
      返回值:
        成功返回实际接收到的字节数
        失败返回-1 
        如果对方退出,recv返回0 

      (4) send 
      ssize_t send(int sockfd, const void *buf, size_t len, int flags);
      功能:
        发送数据
      参数:
        sockfd: 套接字文件描述符 
        buf: 发送数据空间首地址
        len: 发送字节数
        flags: 属性默认为0 
      返回值:
        成功返回实际发送字节数
        失败返回-1 

      (5) connect 
      int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
      功能:
        发送链接请求
      参数:
        sockfd: 套接字文件描述符
        addr: 对方的IP地址信息
        addrlen: IP地址的大小
      返回值:
        成功返回0 
        失败返回-1 

代码示例:

    头文件(head.h):

#ifndef _HEAD_H
#define _HEAD_H

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<netinet/ip.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<strings.h>

#endif

服务器(server.c): 

#include"head.h"

int main(void)
{
    int sockfd = 0;
    int listfd = 0;
    int fd = 0;
    int nret = 0;
    ssize_t nsize = 0;
    char filename[128] = {0};
    char serverfile[1024] = {0};
    struct sockaddr_in server;   //服务器
    struct sockaddr_in client;   //客户端
    socklen_t len = sizeof(client);

    /* 创建套接字 */
    listfd = socket(AF_INET, SOCK_STREAM, 0);   //监听套接字
    if (-1 == listfd)
    {
        perror("fail to socket");
        exit(1);   //相当于return -1
    }

    /* 绑定服务器IP+Port*/
    server.sin_family = AF_INET;
    server.sin_port = htons(50000);
    server.sin_addr.s_addr = INADDR_ANY;   //随机访问本机可用IP
    nret = bind(listfd, (struct sockaddr *)&server, sizeof(server));
    if (-1 == nret)
    {
        perror("fail to bind");
        exit(1);
    }
    
    /* 开始监听 */
    nret = listen(listfd, 10);
    if (-1 == nret)
    {
        perror("fail to listen");
        exit(1);
    }

    /* 通信套接字 */
    sockfd = accept(listfd, (struct sockaddr *)&client, &len);
    if (-1 == sockfd)
    {
        perror("fail to accept");
        exit(1);
    }

    /* 接收文件名 */
    nsize = recv(sockfd, filename, sizeof(filename), 0);
    if (-1 == nret)
    {
        perror("fail to recv");
        exit(1);
    }

    /* 打开文件 */
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (-1 == fd)
    {
        perror("fail to open");
        exit(1);
    }

    /* 接收文件数据 */
    while (1)
    {
        bzero(serverfile, sizeof(serverfile));   //相当于memset(serverfile, 0, sizeof(serverfile));
        nsize = recv(sockfd, serverfile, sizeof(serverfile), 0);
        if (nsize <= 0)
        {
            break;
        }
        write(fd, serverfile, nsize);
        
        bzero(serverfile, sizeof(serverfile));
        strcpy(serverfile, "go on");
        nsize = send(sockfd, serverfile, strlen(serverfile), 0);
        if (-1 == nsize)
        {
            perror("fail to send");
            exit(1);
        }
    }

    /* 关闭文件描述符 */
    close(fd);
    close(listfd);
    close(sockfd);
    return 0;
}

客户端(client.c): 文章来源地址https://www.toymoban.com/news/detail-793001.html

#include"head.h"

int main(void)
{
    int fd = 0;
    int sockfd = 0;
    int nret = 0;
    ssize_t nsize = 0;
    char filename[128] = {0};
    char clientfile[1024] = {0};
    struct sockaddr_in server;

    /* 创建套接字 */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sockfd)
    {
        perror("fail to socket");
        exit(1);
    }

    /* 服务器IP+Port */
    server.sin_family = AF_INET;
    server.sin_port = htons(50000);
    server.sin_addr.s_addr = inet_addr("192.168.0.194");

    /* 发送链接请求 */
    nret = connect(sockfd, (struct sockaddr *)&server, sizeof(server));
    if (-1 == nret)
    {
        perror("fail to connect");
        exit(1);
    }

    /* 发送文件名 */
    printf("请输入待发送文件:\n");
    gets(filename);
    nsize = send(sockfd, filename, sizeof(filename), 0);
    if (-1 == nsize)
    {
        perror("fail to send");
        exit(1);
    }

    /* 打开文件 */
    fd = open(filename, O_RDONLY);
    if (-1 == fd)
    {
        perror("fail to open");
        exit(1);
    }

    /* 发送文件数据 */
    while (1)
    {
        bzero(clientfile, sizeof(clientfile));
        nsize = read(fd, clientfile, sizeof(clientfile));
        if (nsize <= 0)
        {
            break;
        }
        
        nsize = send(sockfd, clientfile, nsize, 0);
        if (-1 == nsize)
        {
            perror("fail to send");
            exit(1);
        }
        
        bzero(clientfile, sizeof(clientfile));
        nsize = recv(sockfd, clientfile, sizeof(clientfile), 0);
        if (-1 == nsize)
        {
            perror("fail to recv");
            exit(1);
        }
    }

    /* 关闭文件描述符 */
    close(fd);
    close(sockfd);
    return 0;
}

到了这里,关于编写程序实现利用TCP实现文件的发送的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实现 TCP/IP 协议栈 纯VHDL代码编写 提供3套vivado工程源码和技术支持

    FPGA实现 TCP/IP 协议栈 服务器 纯VHDL代码编写 提供4套vivado工程源码和技术支持 没玩过TCP网络通信都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前网上fpga实现udp协议的源码满天飞,我这里也有不少,但用FPGA纯源码实现TCP的项目却很少,能上

    2024年02月04日
    浏览(86)
  • FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

    FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持 没玩过TCP网络通信都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前网上fpga实现udp协议的源码满天飞,我这里也有不少,但用FPGA纯源码实现TCP的项目却很少,能上

    2024年02月04日
    浏览(53)
  • FPGA实现 TCP/IP 协议栈 服务器 纯VHDL代码编写 提供4套vivado工程源码和技术支持

    FPGA实现 TCP/IP 协议栈 服务器 纯VHDL代码编写 提供4套vivado工程源码和技术支持 没玩过TCP网络通信都不好意思说自己玩儿过FPGA,这是CSDN某大佬说过的一句话,鄙人深信不疑。。。目前网上fpga实现udp协议的源码满天飞,我这里也有不少,但用FPGA纯源码实现TCP的项目却很少,能上

    2024年02月04日
    浏览(50)
  • vue中利用TCP实现文件的传输

    服务端 客户端

    2024年02月16日
    浏览(35)
  • 程序猿眼中的协议:TCP / IP 五层网络模型

    哈喽,大家好~我是你们的老朋友: 保护小周ღ ,本期为大家带来的是 网络基础原理中的 TCP / IP 五层网络模型,主要从协议的概念,网络模型,数据分层传输的流程,几个方面讲解,看完之后可以轻松的理解数据是如何在网络中传输的,确定不来看看嘛~~ 更多精彩敬请期待

    2023年04月19日
    浏览(52)
  • java实现TCP协议文件传输

    客户端发数据到服务端 服务端 完整代码: 服务端 任务类 服务器类

    2024年02月12日
    浏览(53)
  • 网络程序设计:TCP/IP协议栈源代码分析

    从调用栈中可以看到inet_init被调用的过程 start_kernel函数位于 init/main.c中,是内核的入口位置, 它在系统引导过程中被调用。执行该函数后,内核初始化各种子系统,包括调度器、内存管理、文件系统等。在函数最后,会调用 rest_init 函数来继续剩余的初始化工作。 在rest_in

    2024年01月15日
    浏览(54)
  • 网络程序设计实验:TCP/IP协议栈源代码分析

    深入理解TCP/IP协议栈的源代码结构和功能,探究其与上层套接口和下层数据链路层的关联方式。 分析TCP的三次握手过程,理解其状态转换和数据传输机制。 掌握send和recv操作在TCP/IP协议栈中的执行路径,探究其与上层应用程序的交互方式。 了解路由表、ARP缓存以及IP到MAC地址

    2024年02月03日
    浏览(64)
  • 网络程序设计实验-TCP/IP协议栈源代码分析

    ​ inet_init代码如下: 调用inet_init的过程中,涉及到的函数如下: 1. start_kernel: start_kernel 是Linux内核的启动函数,定义在 init/main.c 文件中。 在启动过程中,首先执行 start_kernel ,这个函数负责进行内核的初始化工作。 2. rest_init: 在 start_kernel 中,会调用 rest_init 函数,该函数的

    2024年02月03日
    浏览(70)
  • 【Qt网络编程】实现TCP协议通信

    传输控制协议(TCP,Transmission Control Protocol)是 一种面向连接的、可靠的、基于字节流的传输层通信协议 ,由IETF的RFC 793 定义。 TCP建立连接前,需要进行三次握手,如下图所示: TCP断开连接前,需要进行四次挥手,如下图所示: Qt中提供了QTcpSocket类和QTcpServer类分别用于创

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包