2011-11-29 206 views
1

我想寫一個簡單的HTTP Web服務器使用C,但我試圖創建它時一直遇到問題。關於創建服務器套接字的一切似乎都很正常;基本上我只是不明白如何將東西發送到瀏覽器。下面是我的代碼在服務器循環建立與客戶套接字連接,然後送東西的網頁摘錄:簡單的Web服務器

for (;;) /* Run forever */ 
    { 
     /* Set the size of the in-out parameter */ 
     clntLen = sizeof(clntAddr); 

     /* Wait for a client to connect */ 
     if ((clntSock = accept(servSock, (struct sockaddr *) &clntAddr, 
           &clntLen)) < 0) 
      DieWithError("accept() failed"); 

     /* clntSock is connected to a client! */ 

     printf("Handling client %s\n", inet_ntoa(clntAddr.sin_addr)); 

     FILE *clientInput = fdopen(clntSock, "r"); 
     char input[1000]; 
     char html[BUFSIZE]; 

     fgets(input, 1000, clientInput); 

     char *token_separators = "\t \r \n"; 
     char *method = strtok(input, token_separators); 
     char *requestURI = strtok(NULL, token_separators); 
     char *httpVersion = strtok(NULL, token_separators); 
     ... 
     char requestMessage[] = "HTTP/1.0 200 OK\r\n\r\n"; 
     send(clntSock, requestMessage, strlen(requestMessage) + 1, 0); 
     ... 

} 

我敢肯定,我的代碼工作的套接字創建和連接,它只是當我嘗試發送這個響應頭我的網頁只是不斷嘗試下載HTML。當我不發送響應頭,我試着發送正常的html,我的網頁工作。

我想我不明白的是爲什麼我的響應頭不起作用。

回答

0

看到帶插座的FILE *是非常不尋常的。使用read/recvwrite/send更爲典型。這使您可以更輕鬆地進行錯誤處理。

也就是說,如果沒有標題,瀏覽器會認爲你的服務器運行的是HTTP/0.9,而且一切都是HTML。爲了把事情的工作權,再添:

HTTP/1.0 200 OK 
Content-Type: text/html;charset=iso-8859-1 

<html> 
... 

當然,這仍然缺少一些作品,但它是一個開始和大多數瀏覽器應該接受它無投訴。您可以查看RFC並查找需要支持的請求方法(GET和HEAD)以及您需要生成的響應頭(Server,Date)。 (我希望你這樣做是出於學習的目的,而不是用於生產。)

你可以很容易檢驗與netcat的迴應:

$ cat file 
HTTP/1.0 200 OK 
Content-Type: text/plain 

Hello, World 
$ nc -l 8000 < file 

然後瀏覽http://localhost:8000。注意上面的BSD netcat的作品,如果你有GNU netcat,你需要閱讀手冊頁。

+0

我認爲這有助於。有沒有更改內容類型的方法,以便顯示圖像? – KWJ2104

+0

您必須指定正在發送的特定類型圖像的正確內容類型,例如:image/bmp,image/jpeg,image/gif,image/png等。 –