iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >如何实现linux下socket文件传输
  • 753
分享到

如何实现linux下socket文件传输

2023-06-28 15:06:12 753人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关如何实现linux下Socket文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 socket?socket 的原意是“插座”,在计算机通信领域,socket

这期内容当中小编将会给大家带来有关如何实现linuxSocket文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

什么是 socket?

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具

socket 的典型应用就是 WEB 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

学习 socket,也就是学习计算机之间如何通信,并编写出实用的程序。

UNIX/Linux 中的 socket 是什么?

在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。

你也许听很多高手说过,UNIX/Linux 中的一切都是文件!那个家伙说的没错。

为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:

  • 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;

  • 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。

UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。

linux下socket文件传输方法:

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能。该示例是基于tcp流协议实现的socket网络文件传输程序。采用C语言编写。最终能够实现传输任何格式文件的文件传输程序。

具体实现代码如下:
Server端代码如下:
[cpp] view plain copy

#include// sockaddr_in
#include // socket
#include// socket
#include   // printf
#include  // exit
#include  // bzero

#define SERVER_PORT 8000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main(void)
{
// 声明并初始化一个服务器端的socket地址结构
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);

// 创建socket,若成功,返回socket描述符
int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0);
if(server_socket_fd {
perror(“Create Socket Failed:”);
exit(1);
}
int opt = 1;
setsockopt(server_socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

// 绑定socket和socket地址结构
if(-1 == (bind(server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))))
{
perror(“Server Bind Failed:”);
exit(1);
}

// socket监听
if(-1 == (listen(server_socket_fd, LENGTH_OF_LISTEN_QUEUE)))
{
perror(“Server Listen Failed:”);
exit(1);
}

while(1)
{
// 定义客户端的socket地址结构
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr);

// 接受连接请求,返回一个新的socket(描述符),这个新socket用于同连接的客户端通信
// accept函数会把连接到的客户端信息写到client_addr中
int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length);
if(new_server_socket_fd {
perror(“Server Accept Failed:”);
break;
}

// recv函数接收数据到缓冲区buffer中
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) {
perror(“Server Recieve Data Failed:”);
break;
}

// 然后从buffer(缓冲区)拷贝到file_name中
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
printf(“%s\n”, file_name);

// 打开文件并读取文件数据
FILE *fp = fopen(file_name, “r”);
if(NULL == fp)
{
printf(“File:%s Not Found\n”, file_name);
}
else
{
bzero(buffer, BUFFER_SIZE);
int length = 0;
// 每读取一段数据,便将其发送给客户端,循环直到文件读完为止
while((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
if(send(new_server_socket_fd, buffer, length, 0) {
printf(“Send File:%s Failed./n”, file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}

// 关闭文件
fclose(fp);
printf(“File:%s Transfer Successful!\n”, file_name);
}
// 关闭与客户端的连接
close(new_server_socket_fd);
}
// 关闭监听用的socket
close(server_socket_fd);
return 0;
}
Client端代码如下:
[cpp] view plain copy

#include // sockaddr_in
#include // socket
#include // socket
#include   // printf
#include   // exit
#include   // bzero

#define SERVER_PORT 8000
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main()
{
// 声明并初始化一个客户端的socket地址结构
struct sockaddr_in client_addr;
bzero(&client_addr, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
client_addr.sin_port = htons(0);

// 创建socket,若成功,返回socket描述符
int client_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(client_socket_fd {
perror(“Create Socket Failed:”);
exit(1);
}

// 绑定客户端的socket和客户端的socket地址结构 非必需
if(-1 == (bind(client_socket_fd, (struct sockaddr*)&client_addr, sizeof(client_addr))))
{
perror(“Client Bind Failed:”);
exit(1);
}

// 声明一个服务器端的socket地址结构,并用服务器那边的IP地址及端口对其进行初始化,用于后面的连接
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_pton(AF_INET, “127.0.0.1”, &server_addr.sin_addr) == 0)
{
perror(“Server IP Address Error:”);
exit(1);
}
server_addr.sin_port = htons(SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);

// 向服务器发起连接,连接成功后client_socket_fd代表了客户端和服务器的一个socket连接
if(connect(client_socket_fd, (struct sockaddr*)&server_addr, server_addr_length) {
perror(“Can Not Connect To Server IP:”);
exit(0);
}

// 输入文件名 并放到缓冲区buffer中等待发送
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
printf(“Please Input File Name On Server:\t”);
scanf(“%s”, file_name);

char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));

// 向服务器发送buffer中的数据
if(send(client_socket_fd, buffer, BUFFER_SIZE, 0) {
perror(“Send File Name Failed:”);
exit(1);
}

// 打开文件,准备写入
FILE *fp = fopen(file_name, “w”);
if(NULL == fp)
{
printf(“File:\t%s Can Not Open To Write\n”, file_name);
exit(1);
}

// 从服务器接收数据到buffer中
// 每接收一段数据,便将其写入文件中,循环直到文件接收完并写完为止
bzero(buffer, BUFFER_SIZE);
int length = 0;
while((length = recv(client_socket_fd, buffer, BUFFER_SIZE, 0)) > 0)
{
if(fwrite(buffer, sizeof(char), length, fp) {
printf(“File:\t%s Write Failed\n”, file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}

// 接收成功后,关闭文件,关闭socket
printf(“Receive File:\t%s From Server IP Successful!\n”, file_name);
close(fp);
close(client_socket_fd);
return 0;
}

什么是Linux系统

Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。

上述就是小编为大家分享的如何实现linux下socket文件传输了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 如何实现linux下socket文件传输

本文链接: https://www.lsjlt.com/news/320258.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何实现linux下socket文件传输
    这期内容当中小编将会给大家带来有关如何实现linux下socket文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 socket?socket 的原意是“插座”,在计算机通信领域,socket...
    99+
    2023-06-28
  • python利用socket实现udp文件传输功能
    本文实例为大家分享了UDP实现文件传输的具体代码,供大家参考,具体内容如下 tcp进行文件传输看这里–python实现TCP文件接发 这里实现的接收方一直接收,发送方每次发送一个文件...
    99+
    2024-04-02
  • Linux下怎么传输文件
    今天小编给大家分享一下Linux下怎么传输文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。scp介绍scp是secure ...
    99+
    2023-06-27
  • 如何利用socket完成VB.NET文件传输
    本篇内容主要讲解“如何利用socket完成VB.NET文件传输”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用socket完成VB.NET文件传输”吧!VB.NET文件传输代码:发送端Pu...
    99+
    2023-06-17
  • golang如何实现大文件传输
    在 Golang 中,可以使用 io 和 os 包来实现大文件的传输。以下是一种可能的实现方式: 首先,需要创建一个服务器端和一个客...
    99+
    2023-10-21
    golang
  • linux中怎么实现文件传输
    这期内容当中小编将会给大家带来有关linux中怎么实现文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。linux的scp命令 linux 的 scp 命令 可以 在 linux 之间复制 文件 和 ...
    99+
    2023-06-13
  • Golang如何实现文件传输功能
    今天小编给大家分享一下Golang如何实现文件传输功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。借助TCP完成文件的传输...
    99+
    2023-07-05
  • java如何使用Socket实现文件上传功能
    这篇文章主要介绍了java如何使用Socket实现文件上传功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下文件上传的步骤:服务器端步骤:创建ServerSock...
    99+
    2023-06-29
  • Linux中如何传输超大文件
    这篇文章主要介绍了Linux中如何传输超大文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文研究的主要内容是Linux下如何传输超大文件,具体如下。linux下的文件传输...
    99+
    2023-06-10
  • Linux下SCP后台运行传输文件
    有的时候我们需要SCP拷贝的文件很大,不能一直等着,那如何使SCP可以在后台运行呢?下面介绍一个简单的方法:1、运行SCP命令[root@test dpdir]# nohup scp OUTDB_ERR.dmp oracle@192.168...
    99+
    2023-06-05
  • 怎么使用java socket传输大文件
    要使用Java Socket传输大文件,可以使用以下步骤:1. 创建一个ServerSocket对象来监听某个端口号,等待客户端连接...
    99+
    2023-09-23
    java
  • 如何进行Linux与windows文件传输
    这期内容当中小编将会给大家带来有关如何进行Linux与windows文件传输,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux系统之间传输文件有很多种方法,此篇博客介绍其中的两种。也是在开发过程中经...
    99+
    2023-06-05
  • HTML5如何实现文件上传下载
    这篇文章主要介绍了HTML5如何实现文件上传下载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言HTML5 中提供的文件API在前端中有着...
    99+
    2024-04-02
  • Django 如何实现文件上传下载
    目录1. 前言 2. 实战一下 2-1  进入虚拟环境,创建一个项目及 App2-2  创建模板目录并配置 settings.py2-3  创...
    99+
    2024-04-02
  • SpringMVC如何实现文件上传下载
    本篇内容主要讲解“SpringMVC如何实现文件上传下载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringMVC如何实现文件上传下载”吧!一、通用配置pom.xml  ...
    99+
    2023-06-22
  • 如何在java中使用socket对zip文件进行传输
    今天就跟大家聊聊有关如何在java中使用socket对zip文件进行传输,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务器端程序:import java.io.*;import j...
    99+
    2023-05-31
    java socket zip文件
  • Django如何实现文件上传下载
    小编给大家分享一下Django如何实现文件上传下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 前言文件上传、下载作为基础功能,在 Web 项目中非常普遍,...
    99+
    2023-06-14
  • Python socket之TCP通信及下载文件如何实现
    这篇“Python socket之TCP通信及下载文件如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Pyt...
    99+
    2023-07-05
  • Linux下如何实现文件切割
    这篇文章主要介绍了Linux下如何实现文件切割,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两...
    99+
    2023-06-28
  • 如何在Alma Linux上实现安全的文件传输和存储
    在Alma Linux上实现安全的文件传输和存储可以通过以下几种方式来实现: 使用SSH(Secure Shell):SSH是一...
    99+
    2024-04-24
    Alma Linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作