【问题标题】:Unix C++ simple server question: sending data back to browserUnix C++ 简单服务器问题:将数据发送回浏览器
【发布时间】:2010-12-23 09:43:29
【问题描述】:

我正在创建一个用 C++ 编写的简单 Unix 服务器,它只是等待传入的连接,然后在建立连接时,它将请求的数据发送回客户端的浏览器以进行显示。除了向客户端发送数据外,我一切正常。它应该是这样工作的:

  1. 我启动服务器并设置端口号(在本例中我将使用 8181)。

  2. 客户端打开浏览器并连接到我位于http://server.mysite.com:8181/test.txt 的服务器并尝试检索 test.txt 以供查看。

  3. 服务器接受传入连接。它检查文件是否存在。如果文件存在,则将文件发送到浏览器进行查看。

我的问题是我不确定如何将数据发送回浏览器进行查看。我正在尝试使用 Unix 系统调用来完成这项工作,因为我相信这就是取回数据所需要的全部内容。

现在我所做的只是从文件中读取()到一个字符数组缓冲区,然后将其输入到 write(socketID, buffer, strlen(buffer)) 命令中。当我测试它时,服务器正确找到文件并将数据读入char数组缓冲区,但是write()命令每次都返回-1错误值。

我想把它放到浏览器连接的地方,然后能够在浏览器中查看 text.txt 以及浏览器支持的图片格式。

有没有办法解决“读入缓冲区,然后将该缓冲区写入套接字”部分并以某种方式将文件直接发送到浏览器?这是我现在正在使用的代码的一部分。我只是在代码的其他部分进行了注释。

//create and bind socket. call listen()...
conn_socket = accept(socketInt, (struct sockaddr *)&caddr, (socklen_t *) &caddrLength);

recvInt = recv(conn_socket, requestedFileBuffer, 1023, 0);
if(recvInt > 0){
    //checks to see that the requestd file exists and correctly 
    //reads that file into char array "buffer"
    int writeInt = write(recvInt, buffer, strlen(buffer));//This is not working
cout << "writeInt is: " << writeInt << endl;// returns -1
}//end if

有人有什么建议吗?如果您需要我发布更多代码,我很乐意这样做,但我相信问题出在上面的代码中。

感谢您的宝贵时间。

【问题讨论】:

标签: c++ unix file connection


【解决方案1】:

当你说:

int writeInt = write(recvInt, buffer, strlen(buffer));

write() 的第一个参数应该是要写入的套接字——你传递的是 recv() 返回的字符数

【讨论】:

    【解决方案2】:

    除了 Neil 的正确答案之外,您可能还需要考虑使用 sendfile() 而不是 write() 如果它在您的平台上可用,因为它提供的发送文件的方式比您所采用的方法更有效.

    如果sendfile() 不可用,您也可以使用mmap() 将文件映射到您的进程地址空间并将生成的缓冲区传递给write()。这可以节省您将文件复制到本地缓冲区中的时间。但是,mmap() 可能仅在大文件的情况下提供增益。一如既往地对您的代码进行基准测试,看看它是否值得使用。

    【讨论】:

      猜你喜欢
      • 2015-10-22
      • 2021-07-12
      • 2013-10-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2020-06-30
      相关资源
      最近更新 更多