Linux-客户端访问mjpeg-stream的web网站,保存图像

news2024/12/27 1:18:12

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define SERVER_IP "192.168.85.207"
#define PORT 8080
#define BUFFER_SIZE 1024

/*
 * Generate an HTTP GET request for a static snapshot.
 * This function creates a properly formatted HTTP GET request string
 * to retrieve a static snapshot from an mjpg - streamer server.
 * Return: A pointer to the generated request string.
 */
char* generate_get_request() {
    char* request = (char*)malloc(1024);
    if (request == NULL) {
        perror("malloc error");
        exit(EXIT_FAILURE);
    }
    sprintf(request, "GET /?action=snapshot HTTP/1.1\r\n"
                    "Host: %s:%d\r\n"
                    "User - Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0\r\n"
                    "Accept: image/jpeg\r\n"
                    "Connection: close\r\n\r\n", SERVER_IP, PORT);
    return request;
}

/*
 * Read data from the server and save it as a file.
 * This function handles receiving data from the server and writing it to a file.
 * It first skips the HTTP header information and then saves the image data.
 * Parameters:
 *      - sockfd: The socket file descriptor connected to the server.
 */
void save_image_from_server(int sockfd) {
    FILE *fp;
    char buffer[BUFFER_SIZE];
    size_t bytes_read;

    /* Open a file to write the image data */
    fp = fopen("received_image.jpg", "wb");
    if (fp == NULL) {
        perror("Error opening file");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    /* Skip the HTTP header information */
    char* http_header_end;
    do {
        bytes_read = recv(sockfd, buffer, BUFFER_SIZE, 0);
        if (bytes_read <= 0) {
            perror("Error receiving HTTP header");
            fclose(fp);
            close(sockfd);
            exit(EXIT_FAILURE);
        }
        printf("Received bytes in header loop: %zu\n", bytes_read);
        http_header_end = strstr(buffer, "\r\n\r\n");
    } while (http_header_end == NULL);

    /* Start writing the image data (skip the HTTP header) */
    fwrite(http_header_end + 4, 1, bytes_read - (http_header_end + 4 - buffer), fp);

    /* Continue receiving and saving the remaining image data */
    while ((bytes_read = recv(sockfd, buffer, BUFFER_SIZE, 0)) > 0) {
        printf("Received bytes of image data: %zu\n", bytes_read);
        fwrite(buffer, 1, bytes_read, fp);
    }

    if (bytes_read < 0) {
        perror("Error receiving image data");
    }

    fclose(fp);
}

int main() {
    int sockfd;
    struct sockaddr_in server_addr;
    char* request;

    /* Create a socket */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error creating socket");
        exit(EXIT_FAILURE);
    }
    printf("Socket created.\n");

    /* Set up the server address structure */
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);

    /* Connect to the server */
    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Error connecting to server");
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    printf("Connected to the server.\n");

    /* Generate an HTTP GET request for a static snapshot */
    request = generate_get_request();

    /* Send the request */
    if (send(sockfd, request, strlen(request), 0) < 0) {
        perror("Error sending request");
        free(request);
        close(sockfd);
        exit(EXIT_FAILURE);
    }
    free(request);
    printf("Request sent.\n");

    /* Get and save the image from the server */
    save_image_from_server(sockfd);

    /* Close the socket connection */
    close(sockfd);
    printf("Socket closed.\n");

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多组学数据如何发表高分SCI论文,以RNA-Seq数据为例

随着高通量测序以及生物信息学的发展&#xff0c;R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才&#xff0c;除了掌握对生物大数据挖掘与分析技能之外&#xff0c;还要具备一定的统计分析能力与SCI论…

攻防世界-easyupload-新手训练区域

赛前回顾 1.文件上传绕过方式 1.mime&#xff1a;可以通过关闭浏览器js&#xff0c;浏览器f12切断点&#xff0c;burp抓包该文件类型来绕过 2.双写php绕过pphphp或者phpphp 3.使用ptml来绕过&#xff0c;phtml也是通过php来解析的 4..htaccess绕过&#xff0c;这个是apache的解…

位图的学习

一&#xff0c;位图介绍 位图&#xff08;Bitmap&#xff09;是一种用于存储图像的方式&#xff0c;它通过二维矩阵&#xff08;由像素组成&#xff09;来表示图像的每一个细节。每个像素通常对应一个特定的颜色值&#xff0c;位图的每个“位”就代表了图像的一个像素。 位图…

正则化(Regularization)

正则化&#xff08;Regularization&#xff09;是机器学习和统计建模中用来防止过拟合的一种技术。当模型过于复杂&#xff0c;例如拥有过多的参数或层级时&#xff0c;它可能会在训练数据上表现得非常好&#xff0c;但对未见过的数据&#xff08;即测试数据或真实世界的数据&a…

集成网关 -- 新节点的开发说明

在node-red中&#xff0c;nVisual节点可以帮助我们更快快简捷的完成新的功能&#xff0c;今天我来分享一下关于node-Red中关于nVisual新节点开发基础教程。 首先来看一下基本node-red节点文件目录&#xff0c;当前新开发的7个节点都放在了“node-red\packages\node_modulesno…

小程序入门学习(六)之本地生活案例

效果图如下&#xff1a; 关键代码如下&#xff1a; app.json {"pages": ["pages/home/home","pages/message/message","pages/contact/contact"],"window": {"backgroundTextStyle": "light","n…

ArcGIS对地区进行筛选提取及投影转换

首先我们需要对坐标系和投影这些概念做进一步的解释。 1、基本概念&#xff1a; 想要理解坐标系和投影的概念&#xff0c;首先我们需要先理解什么是坐标。顾名思义&#xff0c;坐标就是指我们所在的位置&#xff0c;比如我在离旗杆东北部50m处&#xff0c;其实就是离旗杆东边…

MFC图形函数学习13——在图形界面输出文字

本篇是图形函数学习的最后一篇&#xff0c;相关内容暂告一段落。 在图形界面输出文字&#xff0c;涉及文字字体、大小、颜色、背景、显示等问题&#xff0c;完成这些需要系列函数的支持。下面做简要介绍。 一、输出文本函数 原型&#xff1a;virtual BOOL te…

Mysql如何实现原子性(MVCC实现原理)

Mysql如何实现原子性(MVCC实现原理) Mysql实现原子性主要通过一下机制 锁MVCC多版本并发控制 MVCC的实现原理 在介绍MVCC的实现原理之前需要先介绍一下Mysql表中的隐藏字段 , 以及undo_log版本链以及readview 1. Mysql中的隐藏字段 Mysql在创建表的时候除了我们所定义的字…

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题&#xff1a; 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 &#xff01;&#xff01;&#xff01; 2、查询服务器中MySQL中hive的数据库&#xff0c;发现创建的位置没有在hdfs上&#xff0c;而是在本地。 这个错误产生的原因是&…

Leetcode - 周赛426

目录 一&#xff0c;3370. 仅含置位位的最小整数 二&#xff0c;3371. 识别数组中的最大异常值 三&#xff0c;3372. 连接两棵树后最大目标节点数目 I 四&#xff0c;3373. 连接两棵树后最大目标节点数目 II 一&#xff0c;3370. 仅含置位位的最小整数 两种做法&#xff1a…

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化&#xff08;L1 and L2 Regularization&#xff09; 引言1. Forward Pass2. Backward pass到此为止的全部代码&#xff1a; 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值&#xff08;称为惩…

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.1.1 cpu虚拟化 一级目录 一级目录 一级目录 一级目录 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09; 1.1.1 cpu虚…

关于 Qt编译遇到fatal error C1189: #error: “No Target Architecture的 解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144205902 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下&#xff0c;分析酷狗音乐上的热门歌曲及其用户行为趋势&#xff0c;对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析&#xff0c;可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

掌握排序艺术:Java 中常见排序算法的深度解析与实战

排序是计算机科学中的一个基本问题&#xff0c;它在数据处理、搜索和分析中扮演着重要角色。Java提供了多种内置的排序方法&#xff0c;但了解不同排序算法的工作原理及其优缺点对于优化性能和选择合适的解决方案至关重要。本文将详细介绍几种常见的排序算法&#xff0c;包括它…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

Linux系统编程之进程控制

概述 在Linux系统中&#xff0c;创建一个新的进程后&#xff0c;如何对该进程进行有效的控制&#xff0c;是一项非常重要的操作。控制进程状态的操作主要包括&#xff1a;进程的执行、进程的等待、进程的终止等。下面&#xff0c;我们将逐个进行介绍。 进程的执行 创建进程后&a…