2013-06-04 62 views
2

我正在使用以下代碼將簡單網頁複製到'緩衝區'中。C中的HTTP請求語法

char sendBuffer[256]; 
ZeroMemory(sendBuffer, 256); 
strcpy(sendBuffer, "HTTP/1.1 403 Forbidden\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>403 - Forbidden</title>\r\n\t</head>\r\n\t<body>\r\n\t\t<h1>403 - Forbidden</h1>\r\n\t</body>\r\n</html>"); 

這可以在Firefox中使用,但是Chrome只是一種崩潰。

我正在使用\ r \ n作爲我已被告知使用的'CRLF',這是正確的嗎?

+0

您的緩衝區是否足夠容納字符串? –

+2

HTMl沒有\ t標識符 – Magn3s1um

+0

我編輯我的帖子以顯示更多代碼(聲明和零內存調用)。是的,我的緩衝區夠大。 Magn3s1um,這很可能是原因。我應該用什麼替換\ t來製作標籤? (把它作爲答案,以便我可以接受,如果它解決了問題) – Jimmay

回答

0

您錯過了Content-Length標題。如果您包含Connection: close作爲標題以指示連接關閉將指示內容結束,則這不是必需的。

const char msg[] = 
"HTTP/1.1 403 Forbidden\r\n" 
"Connection: close\r\n" 
"Content-Type: text/html\r\n" 
"\r\n" 
"<!DOCTYPE html>\r\n" 
"<html>\r\n" 
"\t<head>\r\n" 
"\t\t<title>403 - Forbidden</title>\r\n" 
"\t</head>\r\n" 
"\t<body>\r\n" 
"\t\t<h1>403 - Forbidden</h1>\r\n" 
"\t</body>\r\n</html>" 
; 

char sendBuffer[256]; 
snprintf(sendBuffer, sizeof(sendBuffer), "%s", msg); 

您否則將必須動態地或靜態地插入消息主體長度成Content-Length報頭。

const char msg_header[] = 
"HTTP/1.1 403 Forbidden\r\n" 
"Content-Length: %d\r\n" 
"Content-Type: text/html\r\n" 
"\r\n" 
"%s" 
; 

const char msg_body[] = 
"<!DOCTYPE html>\r\n" 
"<html>\r\n" 
"\t<head>\r\n" 
"\t\t<title>403 - Forbidden</title>\r\n" 
"\t</head>\r\n" 
"\t<body>\r\n" 
"\t\t<h1>403 - Forbidden</h1>\r\n" 
"\t</body>\r\n</html>" 
; 

char sendBuffer[256]; 
snprintf(sendBuffer, sizeof(sendBuffer), msg_header, 
     sizeof(msg_body)-1, msg_body); 

由於Eddy_Em指出,沒有必要宣佈Connection: close如果服務器實際關閉連接。如果您的服務器在發出此消息後未關閉連接,則需要內容長度。

+0

如果您關閉它,則無需編寫「連接:關閉」! –

+0

連接:關閉不起作用。我會嘗試內容長度 – Jimmay

+0

我嘗試了這兩種解決方案,它們都不在Chrome中工作,而第二個使Firefox表示「加載頁面時服務器的連接已重置」。一半的時間(有時它有效,有時不起作用)。 – Jimmay