Как отправить запрос GET, используя две функции отправки? - PullRequest
1 голос
/ 28 мая 2019

Этот код отправляет запрос GET с помощью одной функции отправки. но я хочу отправить тот же GET запрос, но разбить его и отправить с помощью двух функций отправки. Код приведен ниже.

#include<iostream>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>//the new file.
#include<unistd.h>//for using the sleep function.
using namespace std;
int main(int argc,char* argv[]){
    //first we will do thigns with only one thread.
    char* address;
    address=argv[1];
    int network_socket;
    network_socket=socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_address;
    server_address.sin_family=AF_INET;
    server_address.sin_port=htons(80);
    //now we will set the ip address of the required field.
    inet_aton(address,(struct in_addr*)&server_address.sin_addr.s_addr);
    int connection_status=connect(network_socket,(struct sockaddr*)&server_address,sizeof(server_address));
    if(connection_status){
            cout<<"error in the setting up the connection"<<endl;
    }
    /*
    now since we want to mimic the http we will first send
    a request and then we will accept the reply.

    main question?
    -> how to construct a request ??:)
    */
    char request1[]="GET /index.html HTTP/1.1\r\n\r\n";
    char response[4096];
    send(network_socket,request1,sizeof(request1),0);
    recv(network_socket,&response,sizeof(response),0);
    cout<<response<<endl;
    close(network_socket);
    return 0;
    }
    /*
      but i want something like this
      char request1[]="GET /index.ht";
      char request2[]="ml HTTP/1.1\r\n\r\n";
      send(network_socket,request2,sizeof(request2),0);
      send(network_socket,request2,sizeof(request2),0);

      */
       //but doing this will make server give 400 error

1 Ответ

0 голосов
/ 28 мая 2019

Вы можете заменить следующую часть своего кода:

char request1[]="GET /index.html HTTP/1.1\r\n\r\n";
send(network_socket,request1,sizeof(request1),0);

.. например, таким образом:

char request1a[]="GET /index.html";
char request1b[]=" HTTP/1.1\r\n\r\n";
send(network_socket,request1a,sizeof(request1a)-1,0);
send(network_socket,request1b,sizeof(request1b),0);

Обратите внимание на -1. Это необходимо, потому что вы не хотите отправлять дополнительные '\ 0' на сервер. Использование strlen() может быть альтернативным способом.

TCP ориентирован на поток, поэтому несколько отправок не будут добавлять границы сообщений к передаваемым данным. Может генерировать больше IP-пакетов, но это не нарушит функциональность.

Не забудьте добавить проверку ошибок для этих вызовов функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...