有什么方法可以方便地为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);
你当然可以创建自己的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);
这是C++ - 问题被标记为C.这就是为什么我把它作为注释 –
OP的问题显示了'h.ToString()'和'h.Length()',它不会在C中工作,因为它不会支持类,或者记录中的方法。将C++问题标记为C或使用C++编译器编写C代码并不罕见。如果C++没有被实际使用,那么将我的示例转换为C并不难。这并没有改变我答案的核心要点。但是无论如何,我会用C重写答案。 –
你确定'h.ToString()'不能在C中工作 - 考虑http://codepad.org/CXa3O67c –
这是可用于C++ http://httplib.codeplex.com/如果有任何帮助 –
或[WinHTTP](http://msdn.microsoft.com/en-us/library/windows/desktop/aa382925(v = vs.85).aspx)如果你想坚持本机窗口 – Mgetz