作为我之前关于在纯C中创建Web服务器的帖子的补充,我在发送功能方面遇到了一些麻烦.这是两个代码片段:
int Send(char *message) { int length, bytes_sent; length = strlen(message); bytes_sent = send(connecting_socket, message, length, 0); return bytes_sent; }
此代码将void*发送到当前套接字.奇迹般有效!
现在来了SendHTML
void SendHTML(char *Status_code, char *Content_Type, char *HTML) { char *head = "\r\nHTTP/1.1 "; char *content_head = "\r\nContent-Type: "; char *server_head = "\r\nServer: PT06"; char *length_head = "\r\nContent-Length: "; char *date_head = "\r\nDate: "; char *newline = "\r\n"; char Content_Length[100]; int content_length = strlen(HTML); sprintf(Content_Length, "%i", content_length); char *message = malloc(( strlen(head) + strlen(content_head) + strlen(server_head) + strlen(length_head) + strlen(date_head) + strlen(newline) + strlen(Status_code) + strlen(Content_Type) + strlen(Content_Length) + content_length + sizeof(char)) * 2); if ( message != NULL ) { time_t rawtime; time ( &rawtime ); strcpy(message, head); strcat(message, Status_code); strcat(message, content_head); strcat(message, Content_Type); strcat(message, server_head); strcat(message, length_head); strcat(message, Content_Length); strcat(message, date_head); strcat(message, (char*)ctime(&rawtime)); strcat(message, newline); strcat(message, HTML); Send(message); free(message); } }
如果我要加
Send("Oh end of HTML Sending eh?");
之后Send(message)
和之前free(message)
,这不是发送到浏览器?
我认为这可能是一个HTTP 1.1问题,RFC是否说我只能做一个发送?浏览器收到第一条消息后是否关闭连接?
我如何解决这个问题,以便我可以做到以下几点:
SendHTML("200 OK", "text/plain", "HAaaaii!!"); Send("lolwut?");
这应该导致浏览器显示:
HAaaaii!lolwut?
Joachim Saue.. 6
由于您发送的是内容长度,因此浏览器在"HAaaaii !!"之后将不再接受更多内容.因此会解释"lolwut?" 作为下一个请求的答案的一部分,这当然会失败.
您可以跳过发送内容长度,但这意味着您没有使用keep-alive,因此无法为每个TCP连接处理多个请求.
每个TCP连接处理多个请求 - 响应交换可以大大加快浏览速度,因为普通的Web页面由几个单独的资源组成,每个资源都必须单独请求.并且由于建立TCP连接至少需要3次往返,这将为每个资源增加额外的不必要的延迟.
由于您发送的是内容长度,因此浏览器在"HAaaaii !!"之后将不再接受更多内容.因此会解释"lolwut?" 作为下一个请求的答案的一部分,这当然会失败.
您可以跳过发送内容长度,但这意味着您没有使用keep-alive,因此无法为每个TCP连接处理多个请求.
每个TCP连接处理多个请求 - 响应交换可以大大加快浏览速度,因为普通的Web页面由几个单独的资源组成,每个资源都必须单独请求.并且由于建立TCP连接至少需要3次往返,这将为每个资源增加额外的不必要的延迟.