Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将recv()接收的二进制数据写入文件_C_Sockets_Http_Get_Recv - Fatal编程技术网

如何将recv()接收的二进制数据写入文件

如何将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\

我想使用以下命令将通过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\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);