IOS — 关于Socket传输文件需要自定义延时或者包大小的情况
1. 首先导入头文件
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/stat.h>
2。定义全局变量
int delay;
int sockfd;
char buffer[1024];
struct sockaddr_in sa;
#define sigbuf_lens 512 // 设置包的大小
3. 在获取到是其他设备的IP地址之后 复制一下代码
UrlStr = listarr[0]; // UrlStr为获取到的服务器的地址
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber; // 端口号
portnumber = 80;
host = (__bridge struct hostent *)(UrlStr);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
NSString *addrString = UrlStr;
struct in_addr addr;
if (inet_aton([addrString UTF8String], &addr) != 0) {
uint32_t ip = ntohl(addr.s_addr);
NSLog(@"%08x", ip);
} else {
NSLog(@"invalid address");
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr = addr;
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct
sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
int len = sizeof(sa);
if(!getsockname(sockfd, &sa, &len))//ªÒ»°±æµÿIPµÿ÷∑
{
printf("Local IP£∫%s\n", inet_ntoa(sa.sin_addr));
}
const char * filePathChar = [_upFilePath UTF8String];//_upFilePath 为你需要上传的文件的路径
uint8_t* upDataFilePath = (uint8_t*)filePathChar;
sys_update(upDataFilePath);// 调取升级方法
4. 发送文件的方法
void sys_update(uint8_t *file_name)
{
printf("Start to update:%s, delay:%dmS, lens:%d\n", file_name, delay, sigbuf_lens);
/*sprintf(buffer, CMD_GET_INFO, inet_ntoa(sa.sin_addr));
if(write(sockfd, buffer, strlen(buffer))) {
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}*/
/*if((nbytes=read(sockfd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
uint8_t *index = strstr(buffer, "iot_version")+1;
if( < 0)*/
FILE *fil;
fil = fopen(file_name, "r");//¥Úø™…˝º∂Œƒº˛
if(fil == NULL)
{
printf("open Image FILE fail !! \n");
exit(0);
}
struct stat statbuf;
stat(file_name, &statbuf);
printf("Get File leng = %lld\n", statbuf.st_size);
sprintf(buffer, CMD_UPDATE_START, inet_ntoa(sa.sin_addr));
if(write(sockfd, buffer, strlen(buffer)) < 0){
fprintf(stderr,"CMD_UPDATE_START Error:%s\n",strerror(errno));
exit(1);
}
usleep(1000000);
printf("Start Update\n");
sprintf(buffer, CMD_UPDATE, inet_ntoa(sa.sin_addr), statbuf.st_size);
if(write(sockfd, buffer, strlen(buffer)) < 0){
fprintf(stderr,"CMD_UPDATE Error:%s\n",strerror(errno));
exit(1);
}
sleep(1);
uint32_t i;
for(i=0;i<statbuf.st_size/sigbuf_lens;i++)
{
if( fread(buffer, sigbuf_lens, 1, fil) <= 0)
{
printf("Cannot Read the File!\n");
exit(0);
}
if(write(sockfd, buffer, sigbuf_lens) < 0){
fprintf(stderr,"UPDATE DATA Error:%s\n",strerror(errno));
exit(1);
}
//if(i%10 == 0) {
printf("\rUpdateing %d/%lld", sigbuf_lens*i, statbuf.st_size);
printf(" %lld%%", (i*100)/(statbuf.st_size/sigbuf_lens));
fflush(stdout);
}
usleep(100 * 1000);// 设置数据包之间延时的时间
}
if(statbuf.st_size%sigbuf_lens)//∑¢ÀÕŒƒº˛ƒ©Œ≤≤ø∑÷{
if( fread(buffer, statbuf.st_size%sigbuf_lens, 1, fil) <= 0) {
printf("Cannot Read the File!\n");
exit(0);
}
if(write(sockfd, buffer, statbuf.st_size%sigbuf_lens) < 0){
fprintf(stderr,"UODATE DATA Error:%s\n",strerror(errno));
exit(1);
}
}
//printf("\rUpdateing %d/%d", statbuf.st_size, statbuf.st_size);
//printf(" %d%%\n", 100);
printf("\n");
fflush(stdout);
sleep(1);
sprintf(buffer, CMD_UPDATE_REBOOT, inet_ntoa(sa.sin_addr));
if(write(sockfd, buffer, strlen(buffer)) < 0){
fprintf(stderr,"CMD_UPDATE_REBOOT Error:%s\n",strerror(errno));
exit(1);
}
printf("Update End\n");
}
// 发送完成 搞定
IOS — 关于Socket传输文件需要自定义延时或者包大小的情况的更多相关文章
- Java使用Socket传输文件遇到的问题(转)
1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...
- Java使用Socket传输文件遇到的问题
1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...
- python socket 传输文件
推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...
- 采用socket传输文件
采用socket传输文件 客户端输入文件的地址,服务端判断文件存在,就将文件传输到客户端 package com.fly.socket; import java.io.BufferedInputStr ...
- [转]SOCKET通信中TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...
- Python Socket传输文件
发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一 ...
- Linux C++ TCP Socket传输文件或图片实例
环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...
- Socket传输简单的信息以及粘包问题的解决
一.简单的socket程序——传输简短文字: # -*- coding: utf-8 -*- # -*- Author: WangHW -*- import socket whw_client = s ...
随机推荐
- UIViewController的生命周期(图解)
当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc 创建对象,分配空间2.init (initWithNibName ...
- [FileStream] 使用
// 要上传的文件 FileStream fs = new FileStream(路径, FileMode.Open, FileAccess.Read); FileMode 是指确定如何打开或创建文件 ...
- zookeeper初体验之关于解决quartz重复执行任务的一种思路
前阵子工作中遇到了一个很麻烦的问题.本人所在的项目组做了一个机遇quartz集群的任务系统.通俗点讲就是用quartz框架(quartz是一款能跑定时任务的框架支持复杂的时间表达式)来执行定时任务.但 ...
- mysql分表方法实现
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...
- C语言初学 if-else语句判别在ASCII值中小于32的可控制符的类型
#include<stdio.h> main() { char c; printf("输入一个符号\n"); c=getchar(); if(c<32) prin ...
- soapUI通过groovy脚本设置超时时间
import com.eviware.soapui.SoapUI import com.eviware.soapui.settings.HttpSettings import com.eviware. ...
- Qt调用VC++生成的动态链接库
Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll. testdll.h文件源码如下: #ifdef TE ...
- 常用的Windows批处理
切换执行路径 如果不换盘的话:cd xxx换盘:cd /d xxx 获取当前日期 编写Windows批处理时经常会需要使用到日期和时间作为文件名,所以是非常重要的. 如何获取日期呢?格式: ...
- VS2010 Command Prompt Error:Cannot determine the location of the VS Common Tools folder
就在VS2010 Command Prompt 用vcvarsall.bat x64重新设置环境变量的时候,出现了标题中的错误.原因就在参考链接中 References: http://stackov ...
- android ListView用法介绍
ListView在Android开发中是比较常用的组件,它是以列表的形式展示内容,并且还可以处理用户的选择与点击等操作: LIstView显示数据一般需要三方面: (1)ListView组件:用来展示 ...