C 有谁能建议我,如何实现暂停和恢复功能的数据接收代码?

C 有谁能建议我,如何实现暂停和恢复功能的数据接收代码?,c,linux,http,sockets,download,C,Linux,Http,Sockets,Download,这是从http服务器接收数据的功能代码,工作正常。。但是我想在这个函数中添加暂停和恢复。。 有谁能建议我怎么做吗?? 注意:忽略变量声明 int rest=0,size=0,count=0; memset(buffer,'\0',sizeof(buffer)); do { rc=read(sockfd,buffer,1500); //Reading from socket connection

这是从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*/

以下是我将使用的过程:

  • 使用
    Range:bytes=0-
    HTTP/1.1请求头发送初始请求。 如果服务器以
    HTTP/1.1 206部分内容
    响应,您知道可以稍后恢复连接。 保存
    ETag
    响应头,因为除非服务器上的内容发生更改,和/或
    内容类型发生更改,以及
    最后更改,否则响应头应保持不变-
    修改了标题。
    请注意,
    Content Range
    response标头指定此响应中字节的偏移量,最终数字是完整内容的总长度,
    Content length
    仅指定当前响应的长度(而不是原始内容的长度)

  • 只需关闭连接即可中断传输

  • 使用
    Range:bytes=N-
    HTTP/1.1请求头发送延续请求,其中
    N
    是本地副本中仍然缺少的第一个字节的偏移量。 如果服务器没有响应
    HTTP/1.1 206部分内容
    ,则您没有追索权,只能再次下载整个内容(使用正常的HTTP请求处理)。 如果
    ETag
    内容类型
    上次修改的
    响应标题不匹配,则可能是服务器上修改了内容,您应该断开此连接并下载完整请求。
    Content Range
    response标头指定此响应中字节的偏移量,最终数字是完整内容的总长度,
    Content length
    仅指定当前响应的长度(而不是原始内容的长度)

在所有情况下,服务器都可能使用
chunked
内容传输编码,因此您必须准备好处理该编码,因为请求是HTTP 1.1。有关详细信息,请参阅

在测试时,我建议您使用一个简单的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
#/bin/bash
Host=“localhost”#主机名,使用您自己的服务器
Port=“80”
Query=“/”#请求内容的路径
Range=“0-”#请求的字节范围
#打开连接
exec 3/dev/tcp/$Host/$Port | | exit$?
#设置将刷新标题的读卡器子外壳
#以标准错误为准,以标准输出为准。
(页眉=1
边读边做
Line=“${Line/$'\r'/}”
如果[-z“$Line”];则
标题=0
elif[$Headers-gt 0];然后
printf'%s\n'$Line'>&2
其他的
printf'%s\n'$行
fi
完成
出口0
) &3
#关闭连接(读取端仍然打开)。
执行官3>&-
#然后等待请求完成。
等待

上面的不是HTTP客户机,例如,不进行分块传输;它只是一个调试工具,您可以使用它精确地查看从服务器流向客户端的数据。

暂停并继续执行您需要这种功能的位置和原因?tcp buffer将处理这种情况;为什么要为应用程序承担额外的负担?这是我的项目。。要实现“wget”的功能,您的意思是要停止传输,然后稍后返回并继续,即保留sem下载的文件,并向服务器索取剩余的文件吗?@mojkaro1988,暂停下载只需关闭连接即可。然后,当您希望继续时,您可以在新请求中添加一个
字节范围
头,告诉服务器跳过(不发送)您已经拥有的初始字节。(不过,您可能希望在这两者之间保持某种状态—至少是上次修改的
内容类型
内容长度
响应标题,并且只有在它们仍然匹配时才恢复下载。否则,内容可能已从您下方更改。)