- 浏览: 1482827 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
参考
http://calmness.iteye.com/blog/378463
在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码:
Java代码
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
以上两行代码是传统的read/write方式进行文件到socket的传输。
当需要对一个文件进行传输的时候,其具体流程细节如下:
1、调用read函数,文件数据被copy到内核缓冲区
2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区
3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
4、数据从socket缓冲区copy到相关协议引擎。
以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:
硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎
而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。Sendfile系统调用是在2.1版本内核时引进的:
Java代码
sendfile(socket, file, len);
运行流程如下:
1、sendfile系统调用,文件数据被copy至内核缓冲区
2、再从内核缓冲区copy至内核中socket相关的缓冲区
3、最后再socket相关的缓冲区copy到协议引擎
相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。
★★★★例子代码
[root@VM_253_237_tlinux sendfile]# cat sendserver.c
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <sys/sendfile.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main (int argc, char **argv)
{
struct sockaddr_un sin1;
int server_sockfd, client_sockfd;
int server_len, client_len;
ssize_t bytes, res=0;
ssize_t rtotal = 0;
FILE *stream;
int in_fd;
struct stat buf;
off_t off = 0;
unlink ("server_socket");
unlink ("src_sendfile_save");
stream = fopen ("src_sendfile_save", "w");
if (!stream) {
perror ("fopen");
exit (EXIT_FAILURE);
}
fclose (stream);
if ((in_fd = open ("src", O_RDONLY)) < 0) {
printf ("Can't open 'src' file");
exit (EXIT_FAILURE);
}
if (fstat (in_fd, &buf) == -1) {
printf ("Can't stat 'src' file\n");
exit (EXIT_FAILURE);
}
printf ("Get file size are %u bytes\n", buf.st_size);
server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
if (server_sockfd < 0) {
perror ("socket");
exit (EXIT_FAILURE);
}
sin1.sun_family = AF_UNIX;
strcpy (sin1.sun_path, "server_socket");
server_len = sizeof (sin1);
if (bind (server_sockfd, (struct sockaddr *)&sin1, server_len) < 0) {
perror ("bind");
exit (EXIT_FAILURE);
}
if (listen (server_sockfd, 5) < 0) {
perror ("listen");
exit (EXIT_FAILURE);
}
printf ("The server is waiting for client connect...\n");
client_sockfd = accept (server_sockfd, (struct sockaddr *)&sin1, (socklen_t *)&client_len);
if (client_sockfd == -1 ) {
perror ("accept");
exit (EXIT_FAILURE);
}
while (off < buf.st_size) {
if ((res = sendfile (client_sockfd, in_fd, &off, buf.st_size)) < 0 ) {
printf ("sendfile failed\n");
exit (EXIT_FAILURE);
} else {
rtotal += res;
}
}
printf ("server sendfile total %u bytes\n", rtotal);
close (client_sockfd);
unlink ("server_socket");
return (0);
}
[root@VM_253_237_tlinux sendfile]#
http://calmness.iteye.com/blog/378463
在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码:
Java代码
read(file, tmp_buf, len);
write(socket, tmp_buf, len);
以上两行代码是传统的read/write方式进行文件到socket的传输。
当需要对一个文件进行传输的时候,其具体流程细节如下:
1、调用read函数,文件数据被copy到内核缓冲区
2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区
3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
4、数据从socket缓冲区copy到相关协议引擎。
以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:
硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎
而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。Sendfile系统调用是在2.1版本内核时引进的:
Java代码
sendfile(socket, file, len);
运行流程如下:
1、sendfile系统调用,文件数据被copy至内核缓冲区
2、再从内核缓冲区copy至内核中socket相关的缓冲区
3、最后再socket相关的缓冲区copy到协议引擎
相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。
★★★★例子代码
[root@VM_253_237_tlinux sendfile]# cat sendclient.c #include <sys/types.h> #include <sys/stat.h> #include <sys/sendfile.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> #include <time.h> int main (int argc, char *argv[]) { int a=clock(); printf("this is used %d\n",a); struct sockaddr_un address; int sockfd; int len, result; int i, bytes; struct stat buf; off_t off; ssize_t res, total = 0; int wfd; char rwbuf[4096]; wfd = open ("src_sendfile_save", O_WRONLY); if (wfd < 0) { perror ("open"); exit (EXIT_FAILURE); } /*..socket,AF_UNIX....,SOCK_STREAM....*/ if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror ("socket"); exit (EXIT_FAILURE); } address.sun_family = AF_UNIX; strcpy (address.sun_path, "server_socket"); len = sizeof (address); /*..........*/ result = connect (sockfd, (struct sockaddr *)&address, len); if (result == -1) { printf ("ensure the server is up\n"); perror ("connect"); exit (EXIT_FAILURE); } while ((res = read (sockfd, rwbuf, 4096)) > 0) { total += res; write (wfd, rwbuf, 4096); } printf ("total %u bytes received from server snedfile\n", total); close (sockfd); close (wfd); int b=clock(); printf("this is used %d\n",b); int c=b-a; printf("this is used %d\n",c); return (0); } [root@VM_253_237_tlinux sendfile]#
[root@VM_253_237_tlinux sendfile]# cat sendserver.c
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <sys/sendfile.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main (int argc, char **argv)
{
struct sockaddr_un sin1;
int server_sockfd, client_sockfd;
int server_len, client_len;
ssize_t bytes, res=0;
ssize_t rtotal = 0;
FILE *stream;
int in_fd;
struct stat buf;
off_t off = 0;
unlink ("server_socket");
unlink ("src_sendfile_save");
stream = fopen ("src_sendfile_save", "w");
if (!stream) {
perror ("fopen");
exit (EXIT_FAILURE);
}
fclose (stream);
if ((in_fd = open ("src", O_RDONLY)) < 0) {
printf ("Can't open 'src' file");
exit (EXIT_FAILURE);
}
if (fstat (in_fd, &buf) == -1) {
printf ("Can't stat 'src' file\n");
exit (EXIT_FAILURE);
}
printf ("Get file size are %u bytes\n", buf.st_size);
server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
if (server_sockfd < 0) {
perror ("socket");
exit (EXIT_FAILURE);
}
sin1.sun_family = AF_UNIX;
strcpy (sin1.sun_path, "server_socket");
server_len = sizeof (sin1);
if (bind (server_sockfd, (struct sockaddr *)&sin1, server_len) < 0) {
perror ("bind");
exit (EXIT_FAILURE);
}
if (listen (server_sockfd, 5) < 0) {
perror ("listen");
exit (EXIT_FAILURE);
}
printf ("The server is waiting for client connect...\n");
client_sockfd = accept (server_sockfd, (struct sockaddr *)&sin1, (socklen_t *)&client_len);
if (client_sockfd == -1 ) {
perror ("accept");
exit (EXIT_FAILURE);
}
while (off < buf.st_size) {
if ((res = sendfile (client_sockfd, in_fd, &off, buf.st_size)) < 0 ) {
printf ("sendfile failed\n");
exit (EXIT_FAILURE);
} else {
rtotal += res;
}
}
printf ("server sendfile total %u bytes\n", rtotal);
close (client_sockfd);
unlink ("server_socket");
return (0);
}
[root@VM_253_237_tlinux sendfile]#
发表评论
-
xl2tp 备份
2019-09-24 16:25 7332019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 741sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 601###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 660《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1964参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 965/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 649找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1807上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1007不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4385假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 661964位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1756转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1631接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1550qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1034使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2281转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1837一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
"sendFile"这个标题可能指的是一个实现文件通过TCP协议进行传输的简单程序。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于互联网上的数据交换。 首先,...
在本示例代码中,我们可以通过分析提供的文件来深入理解 `sendfile` 的工作原理和使用方法。 1. **sendfile 函数介绍** - `sendfile` 函数通常用来在两个文件描述符之间传输数据,其中一个描述符通常是打开的文件...
在“豫炜学长写的tcp sendfile QT”项目中,学长利用QT库来实现了一种TCP网络通信,并可能应用了sendfile系统调用,这是一个高效的数据传输机制。 TCP协议确保数据的可靠传输,通过握手建立连接,提供错误检测和...
QT5_sendfile.rar 是一个与QT5框架相关的压缩包,其中包含了两个主要的项目文件:client和server。这通常意味着这个压缩包包含了一个简单的客户端-服务器应用程序示例,使用了QT5库进行开发,可能涉及网络通信和文件...
linux专门为文件传输开放的API sendfile 比你自己写的文件传输程序速度快得多
【标题】"SendFile130"涉及到的主要知识点是电力负控系统中的远程升级与断点续传技术,尤其在广西通讯规约的应用。 【广西负控升级】是指广西地区的电力负荷控制系统的软件更新过程。负控系统是电力部门用来监控和...
`Java_sendfile`标签表明我们正在探讨如何利用Java来实现在网络上发送文件。在这个`Java_file_send.rar`压缩包中,可能包含了一个简单的Java程序示例,用于演示如何完成这一功能。下面将详细解释这个过程,并涵盖...
简单明了地告诉你,如何用java写FTP客户端程序
在VB(Visual Basic)编程环境中,`sendFile_visualbasic_` 涉及的是使用VB技术实现在局域网(LAN)内部署文件传输的应用。这个实例可能包含了一个或者多个VB程序,它们允许用户在局域网内的不同计算机之间发送和...
在PHP中,加速文件下载的方法之一是利用X-SendFile技术。这个技术允许你通过Web服务器(如Apache或Nginx)直接向客户端发送文件,从而避免了PHP处理大文件时可能带来的性能瓶颈。以下是对这个知识点的详细解释: 1....
用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。...sendFile, mmap. 示例:com.github.netty.http.example.HttpZeroCopyController.java4.HttpServlet
"SendFile-开源"是一个专为用户通过TCP/IP协议传输文件而设计的程序,它具有图形用户界面(GUI),使得操作更加直观和便捷。作为开源软件,它的源代码对外公开,允许用户查看、修改和分发,这为开发者提供了定制和...
配置Nginx使用X-Sendfile时,首先要在Nginx配置文件中创建一个内部访问的location,比如`/protected/`,并设置相应的根目录,确保只有Nginx可以访问这些文件: ```nginx location /protected/ { internal; root /...
《简单sendfile:跨平台库实现解析》 在IT领域,高效的数据传输是至关重要的,尤其是在服务器端处理大量文件传输时。"simple-sendfile"是一个针对sendfile系统调用的跨平台库,它旨在简化这一过程,提高性能,并...
主要介绍了asp.net使用Socket.Send发送信息及Socket.SendFile传输文件的方法,结合实例形式分析了asp.net基于socket实现信息与文件传输的相关技巧,需要的朋友可以参考下
glebius@FreeBSD.orgFreeBSD Storage SummitNetflix20 February 2015Gleb Smirnoff glebius@FreeBSD.org New sendfile(2) 20 February 2015 1 / 23History of sendfile(2) Before sendfile(2)Miserable life w/o ...
在IT领域,"SendFile"通常指的是一个操作系统级别的功能,用于高效地从服务器传输文件到客户端。这个功能在网络编程,尤其是HTTP服务器开发中尤为重要。本文将深入探讨SendFile的工作原理、优势以及如何在实际应用中...
send_file Introduce一个使用 NIO + selector + send file 技术的 server + client ,专门用于服务器之间搬运文件。quick start打开 example module src 目录.运行 example.ServerDemo运行 example.ClientDemo注意: ...
在Java的网络编程中,`sendFile`是一个关键的概念,它允许服务器高效地将文件传输到客户端。这个功能是通过Java的NIO(New I/O)库提供的,特别是在`java.nio.channels`包中的`AsynchronousServerSocketChannel`和`...