Linux 图片传输功能c/c++(初版)

由于深度学习任务的需要,要在程序里面嵌入一个module。

这个module 的功能是接收来自ios客户端的图片。并且传送给深度学习分类器进行处理。

于是看了看各种各样的 module 实现方案。

先是用IO函数把图片以数组的方式存起来。

再和服务器建立连接,socket传这个数组。

然后服务器接收完数组以后就再运用IO函数 把数组以图片的方式存起来!

然后用各种网络编程和操作系统的技巧,多线程接收多线程发送来改善速度。

 

现在先讲述一种最原始的 图片传输的module

  这是服务端进程运行

它将接收fish-bike.jpg 并且将之存到/root/photo_out这目录下!

这是客户端进程运行

它将发送/root/photo_in/fish-bike.jpg 给服务进程。同时在本地/root/photo_in/复制一个fish-bike.jpg(这是本地测试的demo)

 传送成功!但是慢!

以下是客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define SERVER_IP "127.0.0.1"
#define PORT 6675int main()
{int socket_fd;socket_fd=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in server_addr;//initialize sockfd 
   memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);//6675server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);//127.0.0.1 local?memset(&(server_addr.sin_zero),0,8);//clean server addr int res =connect(socket_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));//connect server_addr
  printf("connect res is %d\n",res); /*while(1){printf("send send ---->\n");char input[100];char output[100]; memset(input,0,sizeof(input));gets(input);res=write(socket_fd,input,strlen(input));printf("the write resoult is %d\n",res);res=read(socket_fd,output,100);output[res]=0;printf("server says:'%s'\n",output);sleep(1);}*/char path[100];printf("please give the path of photo!\n");char input[100];gets(input);sprintf(path,"/root/photo_in/%s",input);printf("begin to write");write(socket_fd,input,strlen(input));printf("write %s success",input);FILE *out=fopen(path,"r");printf("read %s success",path);FILE *new=fopen("/root/photo_in/new.jpg","w");printf("open /root/photo_in/new.jpg success");int c;sleep(1);printf("ready to open!");while((c=fgetc(out))!=EOF)//open /root/photo_in/cat.jpg 
         {                        //get c of cat.jpgchar photo[100];sprintf(photo,"%d",c);//write c into photo[]int b=atoi(photo);fputc(b,new);// printf("data %s\n",photo);
write(socket_fd,photo,strlen(photo)); //write photo[]to serverusleep(1500);//sleep(?)
}char *end="#";write(socket_fd,end,strlen(end));close(socket_fd);}

以下是服务端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h> //sockaddr_in#define PORT 6675int main()
{int socket_fd;int new_fd;         //建立套接字
     socket_fd=socket(AF_INET,SOCK_STREAM,0);// int socket(int domain, int...
                                          printf("socket_fd is %d\n",socket_fd);//初始化设置地址和端口号struct sockaddr_in server_addr; memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=htonl(INADDR_ANY);memset(&(server_addr.sin_zero),0,8);//设置端口可重用int contain;setsockopt(socket_fd,SOL_SOCKET, SO_REUSEADDR, &contain, sizeof(int));         //绑定fd和本机地址int res=bind(socket_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));printf("bind res is %d\n",res);if(res==-1)                 return -1;if(listen(socket_fd,20)==-1){printf("Failed to listen!\n");return -1;}printf("after listen\n");while(1){struct sockaddr_in client_addr;int size=sizeof(client_addr);new_fd=accept(socket_fd, (struct sockaddr *)&client_addr, &size);if(new_fd==-1){printf("wait for client to connect!\n");sleep(1);continue;}printf("A connect and the new fd is %d\n",new_fd);/*while(1){          char input[100];char output[100];res=read(new_fd,input,100);input[res]=0;printf("client says '%s'\n",input);                   gets(output);res=write(new_fd,output,strlen(output));}*///while(1)
                 {FILE *in;char input[100];res=read(new_fd,input,100);input[res]=0;char path[100];sprintf(path,"/root/photo_out/%s",input);printf("the path is %s\n",path);in=fopen(path,"w");printf("after path\n");char photo[10];while(1){memset(photo,0,10);res=read(new_fd,photo,10);if(res==0){printf("read nothing"); return 0;}photo[res]=0;int d=atoi(photo);//  printf("data %s\n",photo);fputc(d,in);}}}close(socket_fd);close(new_fd); }

 

所以接下来是不放在本地测试,而是放在腾讯云服务器上测试!

放在远端服务器上测试没想到套接字阻塞的现象比本地测试更加严重!

就是 客户端传4 18 3过去 

结果 服务端把4183 当做一个点的像素值写了进去!

 

转载于:https://www.cnblogs.com/zzzPark/p/6388868.html

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

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

相关文章

Val编程-val系列编程思想

利用Val语言可以编写出各种各样的应用程序。正如windows phone面临的窘境一样&#xff0c;受众太小&#xff0c;市场不大。应用程序不多&#xff0c;所以也谈不上成熟。国内的应用程序基本上就是简单的小程序&#xff0c;谈不上什么编程思想。国外许多都是基于kernel的而衍生出…

【pyqt5学习】——bug修复,利用qt资源库qrc文件进行背景图像设置,不显示图像

目录 bug描述 bug分析 bug解决 bug描述 利用下面文章的方法进行资源设置后&#xff0c;有的显示了有的没有显示 【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写_有情怀的机械男的博客-CSDN博客_python qrc目录一、说明二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic…

Datalore:用于机器学习可视化的新Web方案!

前不久&#xff0c;JetBrains团队发布了Datalore&#xff0c;这是一款基于云的web应用程序&#xff0c;用于构建机器学习模型并在Python中创建丰富的可视化。最新的测试版本旨在简化构建机器学习模型的流程&#xff0c;并帮助开发人员进行数据分析。由于Datalore的智能编码辅助…

CSS魔法堂:重拾Border之——图片作边框

前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊&#xff0c;一想到终于不用再添加额外元素来模拟圆角了&#xff0c;但发现border-radius还分水平半径和垂直半径&#xff0c;然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时&#xff0c;实际值会…

共享内存简介和mmap 函数

一、共享内存简介 共享内存区是最快的IPC形式&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区&#xff0c;当这块区域都映射到相同的真正的物理地址空…

【pyqt5学习】——QToolTip,QLabel控件,伙伴关系

目录 0、学习资源 1、给控件设置提示信息——QToolTip 2、QLabel控件&#xff08;显示图像、设置超链接、信号绑定&#xff09; 3、QLabel伙伴关系 1&#xff09;代码 2&#xff09;效果 3&#xff09;知识点addWidget 0、学习资源 PyQt5教程&#xff0c;来自网易云课堂…

SylixOS中select原理及使用分析

2019独角兽企业重金招聘Python工程师标准>>> 1. select接口简介 1.1 select接口使用用例 select是操作系统多路I/O复用技术实现的方式之一。 多路I/O复用技术大致使用场景为&#xff1a;构造一张感兴趣的文件描述符列表&#xff0c;然后调用多路复用的IO接口&#x…

【pyqt5学习】——QLineEdit学习(回显模式)

目录 1、回显模式 2、成果显示 3、知识点 1&#xff09;FormLayout布局添加addRow方法 2&#xff09;在输入框显示灰色提示字体&#xff0c;输入内容时消失setPlaceholderText 3&#xff09;设置回显模式setEchoMode 4、完整代码 1、回显模式 QLineEdit控件的主要功能是输…

【pyqt5学习】——QLineEdit控件输入校验器Validator、掩码setInputMask限制输入、textChanged信号

目录 1、输入校验器——限制输入框输入的内容 1&#xff09;校验器类型——整数、浮点数、数字字母结合&#xff08;正则&#xff09; 2&#xff09;步骤 3&#xff09;结果 ​编辑 ​编辑 4&#xff09;完整代码 2、利用掩码进行输入的限制 0&#xff09;掩码对照表 1…

PyOpenCL图像处理:Box模糊

为什么80%的码农都做不了架构师&#xff1f;>>> # -*- coding: utf-8 -*-from __future__ import absolute_import, print_function import numpy as np import pyopencl as cl import cv2 from PIL import Imagedef RoundUp(groupSize, globalSize): r globalSi…

MySQL日志分类及性能分析你应该知道的知识

为什么80%的码农都做不了架构师&#xff1f;>>> MySQL日志记录了MySQL数据库日常操作和错误信息&#xff0c;MySQL总共有四种类型的日志&#xff0c;通过分析这些日志可以查询到MySQL的运行情况、用户操作、错误信息等&#xff0c;可以为MySQL的管理和优化提供必要…

android基础组件----Button的使用

按钮由文本或图标&#xff08;或文本和一个图标&#xff09;组成&#xff0c;当用户触摸到它时&#xff0c;会发生一些动作。今天我们开始Button的学习。少年的爱情永远不够用&#xff0c;一杯酒足以了却一件心事。 Button的简要说明 根据你是否想要一个带有文本的按钮&#xf…

【pyqt5学习】——QTextEdit控件学习:获取文本、添加文本

目录 1、QTextEdit控件介绍 2、QTextEdit控件添加文本、添加HTML格式 3、QTextEdit控件获取文本、获取HTML格式文本 4、案例 1&#xff09;完整代码 2&#xff09;效果 1、QTextEdit控件介绍 QTextEdit控件是一个支持多行输入的输入框&#xff0c;支持HTML进行格式的设置 2…

空间变化

空间变化 第一种&#xff1a;圆 第二种: 矩形 第三种&#xff1a;正五边形 第四种:正六边形 第五种&#xff1a;腰圆 算法&#xff1a; 在规则图形&#xff08;不包括圆心-直径法&#xff09;中&#xff0c;等于或者超过三个点。一般的&#xff0c;利用p1,p2,p3来建立一个用户…

【pyqt5学习】——QAbstractButton学习(普通按钮QPushButton、工具按钮QToolButton、单选按钮QRadioButton、复选框按钮QCheckBox)

目录 1、按钮介绍 2、普通按钮QPushButton学习 1&#xff09;特殊模式——开关按钮&#xff08;toggle&#xff09; ①将按钮设置为可选择的 ②将按钮按下 判断按钮是否被按下 isChecked() 2&#xff09;给按钮设置前置图标setIcon() ​编辑 3&#xff09;按钮信号 4)完…

挖财后端架构简介

挖财后端技术用的主要是比较大众的东西&#xff0c;Web容器用Tomcat&#xff0c;框架主要是Spring MVC&#xff0c;也有少量的Play&#xff0c;中间服务层是Dubbo&#xff0c;微容器用Spring Boot&#xff0c;服务注册这一块是用ZooKeeper&#xff0c;核心业务开发方式还是围绕…

【pyqt5学习】——QcomboBox学习

目录 1、添加条目&#xff1a; 1)逐一添加 2&#xff09;批量添加 3&#xff09;获取当前选中的索引 4&#xff09;获取当前选中文本 5&#xff09;根据索引获取文本 6&#xff09;统计条目总数 7&#xff09;信号——当前选中的索引发生改变currentIndexChanged() 2、…

vSphere Client 编辑虚拟机属性的问题

vSphere Client 编辑虚拟机属性的问题 编辑虚拟机属性的时候&#xff0c; 出现&#xff1a; vpxclient.vmconfig.cpuid 初始值设置异常之类的&#xff0c;重置了&#xff0c; 并将注册表中的所有vmvare 相关键值删除了&#xff0c; 还是一样的。。 后面参照https://kb.vmware.c…

【pyqt5学习】—— 滑动条Qslider、计数器QSpinBox学习

目录 1、滑动条QSlider 1)常用属性 2&#xff09;实例——利用滑动条来实现字体大小的修改 ​编辑 2、计数器QSpinBox 1&#xff09;属性方法 2&#xff09;实例 1、滑动条QSlider 1)常用属性 self.slider QSlider(Qt.Horizontal)# 设置最小值self.slider.setMinimum(2)…

【pyqt5学习】——对话框QDialog学习(QMessageBox、QColorDialog、QFIleDialog、QFontDialog、QInputDialog)

目录 1、对话框QDialog类别 2、通用对话框 ​编辑 3、消息对话框QMessageBox() 1&#xff09;消息对话框QMessageBox类型 2&#xff09;案例 ​编辑 4、输入对话框QInputDialog 1) 类型 2&#xff09;案例 5、字体格式对话框QFontDialog 6、颜色对话框QColorDialog 1&…