程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件的问题如何解决?下面主要结合日常开发的经验,给出你关于使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件的解决方法建议,希望对你解决使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件有所启发或帮助;

最可移植的解决方案是读取文件,然后以循环方式将数据写到套接字中(同样,接收文件时也采用另一种方法)。您可以read在该缓冲区中分配一个缓冲区,并write从该缓冲区中将其分配到您的套接字中(您也可以使用sendrecv,这是套接字特定的写入和读取数据的方式)。大纲看起来像这样

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;
    }
}

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

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

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

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

解决方法

我想使用能够发送和接收文件的套接字和C / C ++语言实现在Linux上运行的客户端-服务器体系结构。有没有可以简化此任务的库?有人可以举个例子吗?

大佬总结

以上是大佬教程为你收集整理的使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件全部内容,希望文章能够帮你解决使用C / C ++(GCC / G ++)在Linux中的套接字编程中发送和接收文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。