如何将recv()接收的二进制数据写入文件
我想使用以下命令将通过GET请求接收到的所有内容保存到文件:如何将recv()接收的二进制数据写入文件,c,sockets,http,get,recv,C,Sockets,Http,Get,Recv,我想使用以下命令将通过GET请求接收到的所有内容保存到文件: ./client http://example.com/1.jpg > image.jpg 我的recv_buf是2000字节 // Generate HTTP request sprintf(send_buf, "%s %s %s%s %s%s", "GET", path, "HTTP/1.1\r\n", "HOST:", hostname, "\r\n\r\
./client http://example.com/1.jpg > image.jpg
我的recv_buf
是2000字节
// Generate HTTP request
sprintf(send_buf, "%s %s %s%s %s%s", "GET", path, "HTTP/1.1\r\n",
"HOST:", hostname, "\r\n\r\n");
send_len = strlen(send_buf); //length of request to send
bytes_send = send(sockfd, send_buf, send_len, 0);
if (bytes_send <= 0)
{
perror("nothing sended\n");
exit(1);
}
printf("Bytes send: %d\nSended message: %s\n", bytes_send, send_buf);
// receive data
do {
bytes_recv = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
if (bytes_recv <= 0)
{
perror("connection closed or error");
close(sockfd);
freeaddrinfo(results);
exit(0);
}
printf("Bytes received: %d\n", bytes_recv);
//write(1, recv_buf, bytes_recv);
} while (bytes_recv > 0);
您可以按如下方式使用和memcpy
:
unsigned char* buf = 0;
int bufsize = 0;
do {
bytes_recv = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
if (bytes_recv <= 0)
{
perror("connection closed or error");
close(sockfd);
freeaddrinfo(results);
exit(0);
}
buf = realloc(buf, bufsize + bytes_recv);
memcpy(buf + bufsize, recv_buf, bytes_recv);
bufsize += bytes_recv;
} while (bytes_recv > 0);
无符号字符*buf=0;
int bufsize=0;
做{
bytes_recv=recv(sockfd,recv_buf,sizeof(recv_buf),0);
如果(字节数为0);
buf
将不包含已读取的bufsize
字节。或者写入文件并使用malloc
再次读取该文件。fopen()文件,在recv()成功后,当recv()循环退出时,从recv\u buf写入()字节,fclose(),因为收到了0个字节。就是这么简单。其中写入(1,recv_buf,bytes_recv);
使用fwrite(recv_buf,bytes_recv,1,fhandle)进行注释。
应执行此操作(以二进制模式打开fhandle)好的,thx它起作用了,但是我怎样才能将这个二进制数据保存到单个数组中呢?因为我想把标题和正文内容分开,然后保存到image.jpg中?你不想使用数组-你想动态分配内存来存储响应,当你收到更多的itOk时扩展它,然后让我们说,我知道正文内容的大小,我有一个分配了足够的内存,那么如何在那里存储所有响应(所有这些包的顺序正确)?
unsigned char* buf = 0;
int bufsize = 0;
do {
bytes_recv = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
if (bytes_recv <= 0)
{
perror("connection closed or error");
close(sockfd);
freeaddrinfo(results);
exit(0);
}
buf = realloc(buf, bufsize + bytes_recv);
memcpy(buf + bufsize, recv_buf, bytes_recv);
bufsize += bytes_recv;
} while (bytes_recv > 0);