有什么方法可以方便地为Winsock send()生成一个HTTP头,而不是手动连接一个字符串?

问题描述:

例如,而不是这样做:有什么方法可以方便地为Winsock send()生成一个HTTP头,而不是手动连接一个字符串?

char * buf = "HTTP/1.0 200 OK\r\n..."; 
sendRet = send(ClientSocket, buf, strlen(buf), 0); 

事情是这样的:

HttpHeader h; 
h.Version = "1.0"; 
h.Status = "200 OK"; 
h.ContentType = HTTP_CONTENT_TYPE_TEXT_XML; 
... 
sendRet = send(ClientSocket, h.ToString(), h.Length(), 0); 
+1

这是可用于C++ http://httplib.codeplex.com/如果有任何帮助 –

+0

或[WinHTTP](http://msdn.microsoft.com/en-us/library/windows/desktop/aa382925(v = vs.85).aspx)如果你想坚持本机窗口 – Mgetz

你当然可以创建自己的HttpHeader来处理,但你最终还是不得不建立在HTTP它传递给send()之前手动头,例如:

struct HttpHeader 
{ 
    char *Version; 
    char *Status; 
    char *ContentType; 
}; 

char* HttpHeaderToString(HttpHeader *hdr) 
{ 
    int len = strlen(hdr->Version) + strlen(hdr->Status) + 10; 
    if (strlen(hdr->ContentType) > 0) 
     len += (strlen(hdr->ContentType) + 16); 
    //... 

    char *str = (char*) malloc(len); 
    if (str != NULL) 
    {   
     sprintf(str, "HTTP/%s %s\r\n", hdr->Version, hdr->Status); 
     if (strlen(hdr->ContentType) > 0) 
     { 
      strcat(str, "Content-Type: "); 
      strcat(str, hdr->ContentType); 
      strcat(str, "\r\n"); 
     } 
     //... 
     strcat(str, "\r\n"); 
    } 
    return str; 
} 

HttpHeader h; 
h.Version = "1.0"; 
h.Status = "200 OK"; 
h.ContentType = HTTP_CONTENT_TYPE_TEXT_XML; 
... 
char *str = HttpHeaderToString(&h); 
if (str != NULL) 
{ 
    send(ClientSocket, str, strlen(str), 0); 
    free(str); 
} 

另一方面,TCP是一个字节流,因此您不必在单个呼叫中发送所有内容。您可以拨打send()多次,因为你需要,如(检查省略误差为简洁起见):

void SendHttpHeader(HttpHeader *hdr) 
{ 
    send(ClientSocket, "HTTP/", 5, 0); 
    send(ClientSocket, hdr->Version, strlen(hdr->Version), 0); 
    send(ClientSocket, " ", 1, 0); 
    send(ClientSocket, hdr->Status, strlen(hdr->Status), 0); 
    send(ClientSocket, "\r\n", 2, 0); 
    if (strlen(hdr->ContentType) > 0) 
    { 
     send(ClientSocket, "Content-Type: ", 14, 0); 
     send(ClientSocket, hdr->ContentType, strlen(hdr->ContentType), 0); 
     send(ClientSocket, "\r\n", 2, 0); 
    } 
    //... 
    send(ClientSocket, "\r\n", 2, 0); 
} 

HttpHeader h; 
h.Version = "1.0"; 
h.Status = "200 OK"; 
h.ContentType = HTTP_CONTENT_TYPE_TEXT_XML; 
... 
SendHttpHeader(&h); 
+0

这是C++ - 问题被标记为C.这就是为什么我把它作为注释 –

+1

OP的问题显示了'h.ToString()'和'h.Length()',它不会在C中工作,因为它不会支持类,或者记录中的方法。将C++问题标记为C或使用C++编译器编写C代码并不罕见。如果C++没有被实际使用,那么将我的示例转换为C并不难。这并没有改变我答案的核心要点。但是无论如何,我会用C重写答案。 –

+0

你确定'h.ToString()'不能在C中工​​作 - 考虑http://codepad.org/CXa3O67c –