Unix C ++简单服务器问题:将数据发送回浏览器

时间:2009-12-04 20:56:28

标签: c++ unix file connection

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

  1. 我启动服务器并设置端口号(对于此示例,我将使用8181)。

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

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

  4. 我的问题是我不确定如何将数据发送回浏览器进行查看。我正在尝试使用Unix系统调用来完成这项工作,因为我认为应该需要所有这些才能恢复数据。

    现在我正在做的就是从文件中读取()到char数组缓冲区,然后将其输入到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
    

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

    感谢您的时间。

2 个答案:

答案 0 :(得分:6)

当你说:

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

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

答案 1 :(得分:2)

除了Neil的正确答案之外,您可能还需要考虑使用sendfile()代替write(),如果它在您的平台上可用,因为它提供了一种比接近方法更有效的发送文件的方法你正在服用。

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