0

GETメソッドを処理するHTTPプロキシサーバーを構築する必要があります。
クライアント(Webブラウンサー)からプロキシサーバーへの接続を確立でき、プロキシは再フォーマットされたヘッダーをサーバーに送信して応答を取得しています。
ただし、プロキシはデータ全体を受信して​​いません。

私のコードは次のとおりです。

main(int argc,char **argv)
 {
//Server binds to particular port
//Waiting for connection");
for(;;)
{
     //Connect to client
    handle_connection(connfd,&cli_addr);
    close(connfd);

}
}
void handle_connection(int connfd, struct sockaddr_in *cli_addr)
{
struct sockaddr_in host_addr;
char buffer[BUFFSIZE];
int rfd,n;
char** http_args;
url* requested_url;
struct hostent *hp;

bzero(buffer, BUFFSIZE);

if ((rfd = read(connfd,buffer,BUFFSIZE)) < 0 ) {
    perror("Error reading from socket.");
    return;
}
buffer[rfd]='\0';

split_line( (char*)buffer, (char**)http_args,2);
requested_url = parse_request(http_args[1]);

//Printing
    printf("\nCommand: %s\n", http_args[0]);
    printf("Url: %s\n", http_args[1]);
    printf("proto: %d\n",requested_url->proto);
    printf("port: %d\n",requested_url->port);
    printf("host: %s\n",requested_url->host);
    printf("File: %s\n",requested_url->file);


if((strcmp(http_args[0],"GET"))!=0)
{
printf("here");
http_error_messages(connfd, http_args[0], 501, "Not Implemented","Proxy does not implement this method");
return;
}

//Connection to request made to server on rfd 
sprintf(buffer, "%s %s HTTP/1.%d\r\nHost: %s:80\r\n\r\n"
        , http_args[0], requested_url->file, requested_url->proto, requested_url->host);
printf("In the Server %s",buffer);
//printf("In the Server %s",get_header);
n = write(rfd,buffer,sizeof(buffer));
shutdown(rfd,2);

char buff[MAXLINE];
while((n = read(rfd, buff, MAXLINE)) > 0) {
    write(connfd, buff, MAXLINE);
    printf("%s",buff);
    }
    if(n<0)
    {
    perror("Error in reading");
    }
    shutdown(rfd,1);
    shutdown(connfd,2);

close(rfd); 

 }
4

1 に答える 1

1

TCP ソケットではread()、予想される終了文字 ( \n?) が読み取られるか、必要なバイト数が読み取られるまで、繰り返し呼び出す必要があります。

read()TCP パケットがどのようにセグメント化/バッファリング/混乱されるかに応じて、部分的なデータを返すか、データを返さない可能性があります。

于 2012-10-31T16:59:33.420 に答える