Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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标准库HTTP 301使用Objective-C上的套接字重定向_C_Objective C_Sockets_Redirect_C Standard Library - Fatal编程技术网

C标准库HTTP 301使用Objective-C上的套接字重定向

C标准库HTTP 301使用Objective-C上的套接字重定向,c,objective-c,sockets,redirect,c-standard-library,C,Objective C,Sockets,Redirect,C Standard Library,我是Objective-C中使用C标准库的sockets的初学者。我试图通过HTTP请求在自行开发的浏览器上获取页面,为此,我们使用如下查询请求: +(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError { //[...] const char* query = [[NSString stringWithFormat:@"GET /%s HTTP/1.1\r\nHost: %s\r\nUser-Agen

我是Objective-C中使用C标准库的sockets的初学者。我试图通过HTTP请求在自行开发的浏览器上获取页面,为此,我们使用如下查询请求:

+(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError {
    //[...]
    const char* query = [[NSString stringWithFormat:@"GET /%s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %@\r\nConnection: close\r\n\r\n",
                                page, hostname, userAgentAsNSString] cStringUsingEncoding:NSUTF8StringEncoding];
    //[...]
}
其中page是路径(如果存在),hostname是URL,user agent是一些设备信息,如iOS版本、设备名称等。 已使用以下协议和类型创建套接字:

+(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError {
    //socket creation with TCP protocol and IPv4.
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    //[...]

    //send request query to the server
    size_t sentSoFar = 0;
    do {
        size_t bytesSent = write(sockfd, query + sentSoFar, strlen(query) - sentSoFar);
        if(bytesSent == -1)
        {
            //send error message

            close(sockfd);
            return nil;
        }
        else if (bytesSent == 0)
        {
            // All done.
            break;
        }

        sentSoFar += bytesSent;

    } while (sentSoFar < strlen(query));

    //[...]

    // Read the response from the server.
    int BUFFER_SIZE = 1024;
    char response[BUFFER_SIZE];

    fd_set rfds;
    struct timeval tv;
    bool htmlStarted = false;
    int done = 0;;

    size_t bytesRead = read(sockfd, response, BUFFER_SIZE);

    //parsing response
}
当我们点击链接并发送带有HTTPS方案的新URL时,仍然会出现状态为301的响应。我们已经尝试将查询更改为HTTP/2,但仍然收到相同的响应(使用HTTP/1.1)。
我认为这可能是我的套接字配置的一个问题,但这里进入了我不熟悉的部分,因此我不知道该怎么办。

看起来您正在从http重定向到https,它使用不同的端口,当然还有TLS加密,如果您使用的话还不清楚。简单的方法是使用libcurl这样的库来处理请求,而不是手动执行。如果苹果提供的话,我也不会感到惊讶。是的,我试图了解如何处理这些HSTS重定向,但我从来没有听说过libcurl。那我就试着用它。谢谢你的帮助suggestion@Romãomartine查看301响应的
位置
标题,将其与您请求的原始URL进行比较。您可能会看到它们之间的差异(HTTP与HTTPS、缺少尾随反斜杠与所需尾随反斜杠等)。为什么您要手动执行此操作而不是使用?HTTP从零开始实现并不是件小事,当你真正开始深入研究它时,它是相当复杂的。@RemyLebeau我有一个场景,其中一些网络测试已经使用了苹果的HTTP API,但你对复杂性的看法是对的,我将尝试使用其他库来避免这个手动请求。谢谢
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.stackoverflow.com/">here</A>.
</BODY></HTML>