Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有任何方法可以方便地为Winsock send()生成HTTP头,而不是手动连接字符串?_C++_C_Winsock_Winsock2 - Fatal编程技术网

C++ 是否有任何方法可以方便地为Winsock send()生成HTTP头,而不是手动连接字符串?

C++ 是否有任何方法可以方便地为Winsock send()生成HTTP头,而不是手动连接字符串?,c++,c,winsock,winsock2,C++,C,Winsock,Winsock2,例如,不要这样做: 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.ToStr

例如,不要这样做:

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;
}

另一方面,TCP是一个字节流,因此您不必在一个
send()
调用中发送所有内容。您可以根据需要多次调用
send()
,例如(为了简洁起见,省略了错误检查):


这是可以用C++的,如果它是任何帮助的话,如果你想坚持本机窗口,这是C++——问题是标签C。这就是为什么我把它作为评论。OP的问题显示了代码> h toSTRIN()< <代码> > H.LangthHe()/Cuth>,这在C中不适用,因为它不支持类或记录中的方法。将C++问题标记为C,或者使用C++编译器编写C代码并不少见。如果C++实际上没有被使用,那么将我的例子翻译成C并不困难。这并没有改变我答案的核心要点。但是无论如何,我会在C中重写答案。你确信<代码> h toSTRIN()<代码>在C -考虑@ EdCult中无效吗?指向的函数需要将
struct
作为输入参数传递给它,以便它知道要对哪些数据进行操作。这与简单地调用独立函数没有什么不同,如我的示例所示。记住,C中没有
这个
指针。必须编写
h.ToString(&h)
,你不这么认为吗?
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);
}
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);