当前位置: 首页 > 面试题库 >

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

马业
2023-03-14
问题内容

我想使用能够发送和接收文件的套接字和C / C ++语言实现在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它可以随心所欲。它告诉内核将文件从一个文件描述符发送到另一个文件描述符,然后内核可以处理其余的文件。需要注意的是,源文件描述符必须支持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#.net 中使用 UDP 异步套接字,我想让服务器和客户端在不同的端口进行通信以进行发送和接收, 服务器使用端口 A 发送到客户端,从具有端口 B 的客户端接收 客户端从具有端口 A 的服务器接收数据,并将数据发送到具有端口 B 的服务器 可能吗??

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 问题内容: 我正在尝试为请求和响应应用程序创建桌面客户端。 我能够轻松地执行GET请求。但是我想知道是否有人可以帮助我确定如何进行JSON请求和响应。并将其解析为字符串,从那里我可以锻炼如何将其全部切开 问题答案: Json.net在.net世界中无处不在。

  • 问题内容: 我正在尝试开发一个非常简单的客户端/服务器,其中客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 当前,程序仅创建一个空文件。我不是一个出色的Java开发人员,因此不胜感激。 这是接收客户端发送的内容的服务器部分。 这是客户端部分 问题答案: 在Java中复制流的正确方法如下: 希望我每次在论坛上发布时都能获得一美元。

  • 问题内容: 我需要使用套接字从C ++客户端到Java服务器接收包含浮点数的数组或类。但是InputStreamReader没正确。任何原因。任何更简单的建议将不胜感激。谢谢。 Java服务器代码 我将那些浮点数存储在名为“值”的类中。但是我得到的价值是垃圾。我在发送前检查C ++代码中的值,它们看起来不错。不知道哪里出了问题。请帮忙…!! 问题答案: 我建议你试试

  • 如何通过tcp套接字接收struct并输出到文件?我有一个结构,这是一个包,我试图通过套接字发送它,在客户端接收它,并写入文件。我使用一个空指针作为缓冲区来存储文件数据 到目前为止,我有 我能够访问客户端的 id、int,但是当我将数据写出到文件时。文件似乎已损坏。 更新: 服务器有一个打开的文件,它将从该文件中读取数据,并将其制成一个数据包,然后将该数据包发送给客户端。 客户端还将打开一个文件进