C 有谁能建议我,如何实现暂停和恢复功能的数据接收代码?
这是从http服务器接收数据的功能代码,工作正常。。但是我想在这个函数中添加暂停和恢复。。 有谁能建议我怎么做吗??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
注意:忽略变量声明
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*/
以下是我将使用的过程:
- 使用
HTTP/1.1请求头发送初始请求。 如果服务器以Range:bytes=0-
响应,您知道可以稍后恢复连接。 保存HTTP/1.1 206部分内容
响应头,因为除非服务器上的内容发生更改,和/或ETag
内容类型发生更改,以及
最后更改,否则响应头应保持不变- 修改了标题。 请注意,
response标头指定此响应中字节的偏移量,最终数字是完整内容的总长度,Content Range
仅指定当前响应的长度(而不是原始内容的长度)Content length
- 只需关闭连接即可中断传输
- 使用
HTTP/1.1请求头发送延续请求,其中Range:bytes=N-
是本地副本中仍然缺少的第一个字节的偏移量。 如果服务器没有响应N
,则您没有追索权,只能再次下载整个内容(使用正常的HTTP请求处理)。 如果HTTP/1.1 206部分内容
、ETag
或内容类型
响应标题不匹配,则可能是服务器上修改了内容,您应该断开此连接并下载完整请求。上次修改的
response标头指定此响应中字节的偏移量,最终数字是完整内容的总长度,Content Range
仅指定当前响应的长度(而不是原始内容的长度)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,暂停下载只需关闭连接即可。然后,当您希望继续时,您可以在新请求中添加一个
字节范围
头,告诉服务器跳过(不发送)您已经拥有的初始字节。(不过,您可能希望在这两者之间保持某种状态—至少是上次修改的、内容类型
和内容长度
响应标题,并且只有在它们仍然匹配时才恢复下载。否则,内容可能已从您下方更改。)