栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件

最可移植的解决方案是读取文件,然后以循环方式将数据写到套接字中(同样,接收文件时也采用另一种方法)。您可以

read
在该缓冲区中分配一个缓冲区,并
write
从该缓冲区中将其分配到您的套接字中(您也可以使用
send
recv
,这是套接字特定的写入和读取数据的方式)。大纲看起来像这样:

while (1) {    // Read data into buffer.  We may not have enough to fill up buffer, so we    // store how many bytes were actually read in bytes_read.    int bytes_read = read(input_file, buffer, sizeof(buffer));    if (bytes_read == 0) // We're done reading from the file        break;    if (bytes_read < 0) {        // handle errors    }    // You need a loop for the write, because not all of the data may be written    // in one call; write will return how many bytes were written. p keeps    // track of where in the buffer we are, while we decrement bytes_read    // to keep track of how many bytes are left to write.    void *p = buffer;    while (bytes_read > 0) {        int bytes_written = write(output_socket, p, bytes_read);        if (bytes_written <= 0) { // handle errors        }        bytes_read -= bytes_written;        p += bytes_written;    }}

请务必阅读的文档

read
write
处理错误时小心翼翼,尤其是。一些错误代码意味着您应该重试一次,例如,仅使用一条
continue
语句再次循环,而其他错误代码则表明某些内容已损坏,您需要停止。

为了将文件发送到套接字,有一个系统调用,

sendfile
它可以随心所欲。它告诉内核将文件从一个文件描述符发送到另一个文件描述符,然后内核可以处理其余的文件。需要注意的是,源文件描述符必须支持
mmap
(例如,是实际文件,而不是套接字),而目标文件必须是套接字(因此,您不能使用它来复制文件或直接从一个文件发送数据插入另一个);它旨在支持您描述的将文件发送到套接字的用法。但是,这对接收文件没有帮助。您将需要为此做循环。我不能告诉你为什么有
sendfile
电话,却没有类似电话
recvfile

注意

sendfile
Linux特定的;它不能移植到其他系统。其他系统通常有其自己的版本
sendfile
,但确切的接口可能有所不同(FreeBSD,Mac
OS
X

和Solaris)。

在Linux
2.6.17中,引入了

splice
系统调用,从2.6.23
版开始,该调用在内部用于实现。是比更为通用的API
。有关and的详细说明,请参阅Linus自己的相当不错的解释。他指出use基本上和上面的循环using
和一样,只是缓冲区在内核中,因此数据不必在内核和用户空间之间传输,甚至可能永远不会通过CPU。 (称为“零复制I /
O”)。
sendfile
splice``sendfile``splice``tee
splice``read``write



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392951.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号