我正在通过int main(int argc,char *argv[]){
int sockfd, linenum; //declare necessary variables
char str[100];
char i[100];
char server_respose[2000],line1[1000],line2[1000],line3[1000],line4[1000],line5[1000];
char welcome[100];
struct sockaddr_in servaddr; // socket address struct
if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
}
sockfd = socket(AF_INET, SOCK_STREAM, 0); //create a socket with the appropriate protocol
if (sockfd == -1)
{
printf("Could not create socket\n");
}
puts("Socket created");
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_port = htons(1999);
memset(servaddr.sin_zero, '\0', sizeof servaddr.sin_zero);
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr))<0){
perror("connect failed. Error");
return 1; // attempt to connect to a socket
}
printf("--You are connected to the server--\n");
recv(sockfd, welcome, 100, 0)
...
}
从远程服务器下载文件。该脚本将通过Platypus打包为应用程序,如果脚本输出的格式为curl
,则可让应用显示百分比进度,如here所述。我试过这个
PROGRESS:\d+\n
获取输出百分比,它不起作用。我尝试了另一种方法here。这没效果。
如何并行捕获像curl -O <remote_file> | sed -r 's/[# ]//g;s/^/#/g'
这样的下载和回显文本。
P.S也许是因为Bash和GNU Sed不存在,它没有按预期工作。
答案 0 :(得分:1)
首先,curl
输出标准错误输出上的渐进信息,因此您必须至少考虑STDERR,例如使用2>&1
将其与STDOUT合并。
其次,curl
在下载文件时不生成\n
符号,但在下载文件时保持在同一行以覆盖显示的进度。因此,您可能必须通过char输出流来读取char,例如使用IFS= read -r -n1 char
。
给定一个curl
- 像进程字符串流,我建议使用一个保护机制来知道必须保留哪个字符:
%
符号,我们现在不想再保留字符了以下代码使用这些想法,可能适合您的问题。
curl -# -O URL 2>&1 | while IFS= read -r -n1 char; do
[[ $char =~ [0-9] ]] && keep=1 ;
[[ $char == % ]] && echo "PROGRESS:$progress" && progress="" && keep=0 ;
[[ $keep == 1 ]] && progress="$progress$char" ;
done
享受!
PS:您当然可以通过连接所有这些代码将其用作oneliner,但我认为这样更容易阅读。