0

これは、httpサーバーからのデータ受信機能コードであり、完全に機能しています..しかし、この機能に一時停止と再開を追加したい..誰かが私にその方法を提案できますか??
注: 変数の宣言は無視してください。

int rest=0,size=0,count=0;                               
memset(buffer,'\0',sizeof(buffer));
do {
    rc=read(sockfd,buffer,1500);                  //Reading from socket connection
    if(rest==0)
    {   /*Extracting Content length*/
        data=strstr((char*)buffer,"Content-Length"); 
        if(data!=NULL)
        {
            value=atoi((char*)data+15);data_rest=value;
            rest=1;
        }
    }
    if(count==0)
    {   /*Extracting Header*/
        content=strstr(buffer,"\r\n\r\n");
        if(content!=NULL)
        { 
            printf("FOUND Header END\n");
            content=content+4;count=1;
            /*copying DATA to the file which has same Extension*/
            data_wrote=fwrite(content,sizeof(char),rc-(content-buffer),fp);
        }
    }
    else
    {
        content=buffer;
        /*copying DATA to the file which has same Extension*/
        data_wrote=fwrite(content,sizeof(char),rc,fp);
    }
    size=size+rc;
    total_wrote=total_wrote+data_wrote;
    printf("Total size = %d\n",size);

    memset(buffer,'\0',sizeof(buffer));
} while(rc>0);  /*until end of file*/
4

1 に答える 1

0

これが私が使用するプロセスです:

  • Range: bytes=0-HTTP/1.1 リクエスト ヘッダーを使用して最初のリクエストを送信します。サーバーが で応答する場合は、HTTP/1.1 206 Partial content後で接続を再開できることがわかります。ETagサーバー上のコンテンツが変更されない限り変更されないままにする必要があるため、応答ヘッダーをContent-Type保存しますLast- ModifiedContent-Range応答ヘッダーは、この応答のバイトのオフセットを指定し、最後の数字は完全なコンテンツの全長であり、現在の応答の長さのみを指定することに注意してくださいContent-Length(元のコンテンツの長さではありません)。

  • 接続を閉じるだけで送信を中断します。

  • Range: bytes=N-HTTP/1.1 要求ヘッダーを使用して継続要求を送信します。ここNで、 はまだローカル コピーから欠落している最初のバイトへのオフセットです。サーバーがHTTP/1.1 206 Partial content. ETagContent-Type、または応答ヘッダーが一致しない場合はLast-Modified、コンテンツがサーバー上で変更された可能性があるため、この接続を切断して、代わりに完全な要求をダウンロードする必要があります。Content-Range応答ヘッダーは、この応答のバイトのオフセットを指定します。最後の数字は完全なコンテンツのContent-Length全長であり、現在の応答の長さのみを指定します (元のコンテンツの長さではありません)。

いずれの場合も、サーバーがchunkedコンテンツ転送エンコーディングを使用する可能性があるため、リクエストが HTTP 1.1 であるため、それを処理できるように準備する必要があります。詳細については、RFC2616を参照してください。

これをテストするときは、単純な Bash スクリプトを使用して、カスタム ヘッダーを使用して URL に接続し、応答ヘッダーを標準エラーに出力し、メッセージ コンテンツを標準出力に出力することをお勧めします。

#!/bin/bash

Host="localhost"   # Host name, use your own servers
Port="80"
Query="/"          # Path to the content requested
Range="0-"         # Byte range requested

# Open up a connection
exec 3<>/dev/tcp/$Host/$Port || exit $?

# Set up a reader sub-shell that will flush the headers
# to standard error, and content to standard out.
(   Headers=1
    while read Line ; do
        Line="${Line//$'\r'/}"
        if [ -z "$Line" ]; then
            Headers=0
        elif [ $Headers -gt 0 ]; then
            printf '%s\n' "$Line" >&2
        else
            printf '%s\n' "$Line"
        fi
    done
    exit 0
) <&3 &

# Construct a byte-range request:
Request=""
Request="$Request""GET $Query HTTP/1.1"$'\r\n'
Request="$Request""Host: $Host"$'\r\n'
Request="$Request""Range: bytes=$Range"$'\r\n'
Request="$Request""Connection: close"$'\r\n'

# Do a normal request.
printf '%s\r\n' "$Request" >&3

# Close the connection (the read end is still open).
exec 3>&-

# and wait for the request to complete.
wait

上記は HTTP クライアントではなく、たとえば、チャンク転送を行いません。これは、サーバーからクライアント側に流れるデータを正確に確認するために使用できる単なるデバッグ ツールです。

于 2012-11-02T16:31:29.950 に答える