2009-12-04 45 views
0

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

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

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

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

我的问题是,我不知道如何将数据发送回浏览器进行查看。我正在尝试使用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 

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

谢谢你的时间。

+1

你读过Beej的网络编程指南吗? http://beej.us/guide/bgnet/ – 2009-12-04 20:59:37

回答

6

当你说:

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

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

+0

/doh 谢谢尼尔。 – Noob 2009-12-05 00:17:40

2

计数除Neil的正确答案是,如果您的平台可以使用sendfile()而不是write(),那么您可能会考虑使用sendfile(),因为它提供了一种比您采用的方法更有效的发送文件的方式。

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

相关问题