2009-12-04 47 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()只能在大文件的情況下提供收益。像往常一樣對你的代碼進行基準測試,看看它是否值得使用它。

相關問題