Почему нет ответа от iphone после ответа HTTP CONNECT прокси - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь создать прокси-сервер, в настоящее время хочу узнать, почему iPhone, на котором я тестирую его, отправляет запрос CONNECT, получает ответ «HTTP 200 Connection Установлено» и обычно никогда не отвечает после этого.(иногда он мгновенно отвечает «0» или NULL)

На самом деле я не подключаюсь к тому, куда iPhone хочет перейти, но я отправляю ответ, который указывает, что прокси-сервер подключился

Терминальный вывод:

./proxy 9000

В этот момент я ввожу свой локальный ip в настройках прокси iPhone

Пример вывода:

REC:
CONNECT clientmetrics.kik.com:443 HTTP/1.1
Host: clientmetrics.kik.com
User-Agent: Kik/14.4.0.11622 CFNetwork/897.15 Darwin/17.5.0
Connection: keep-alive
Proxy-Connection: keep-alive

Sent:
HTTP/1.1 200 Connection Established

REC:
// Typically \0 or a 0, or no recv takes place

Код:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
if(argc == 2) {
    int main(int argc, char* argv[]) {
       system("clear");

        // Set up socket, family, port, ip address
        int serversocket = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in serverinfo;
        serverinfo.sin_family = AF_INET;
        serverinfo.sin_addr.s_addr = INADDR_ANY;
        serverinfo.sin_port = htons(atoi(argv[1]));

        // bind server info to socket
        if(bind(serversocket, (struct sockaddr*)&serverinfo, sizeof(serverinfo)) == -1) {
             printf("failed  to bind port to socket, change port\n");
             return -1;
        }

        // accept a connection
        listen(serversocket, 1);
        int clientsocket = accept(serversocket, NULL, NULL);

        // recv and print client message
        char buffer[2048];
        memset(buffer, 0, sizeof(buffer));
        if(recv(clientsocket, buffer, sizeof(buffer), 0) == -1) {
            printf("Failed in recv function\n");
        } else {
            printf("REC\n%s\n", buffer);
        }

        // send Connection Established
        char* sendbuffer = "HTTP/1.1 200 Connection Established";
        if(send(clientsocket, sendbuffer, sizeof(sendbuffer), 0) == -1) {
            printf("Failed in send function\n");
        } else {
            printf("Sent:\n%s\n", sendbuffer);
            // Recv response from iPhone
            memset(buffer, 0, sizeof(buffer));
            if(recv(clientsocket, buffer, sizeof(buffer), 0) == -1) {
                 printf("Failed in recv function\n");
            } else {
                printf("REC:\n%s\n", buffer);
            }
        }

    } else {
        printf("Usage: ./proxy <port>\n");
        return 0;
    }
}

1 Ответ

0 голосов
/ 16 сентября 2018

Просто возился еще немного и обнаружил, что iPhone никогда не будет отвечать за мой запрос CONNECT, потому что соединение должно быть закрыто после того, как прокси-сервер ответит HTTP 200 - тогда соединение может быть восстановлено, и iphone продолжит отправлять данные

...