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传输文件需要自定义延时或者包大小的情况的更多相关文章

  1. Java使用Socket传输文件遇到的问题(转)

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  2. Java使用Socket传输文件遇到的问题

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  3. python socket 传输文件

    推荐资料 https://www.cnblogs.com/xiaokang01/p/9865724.html socket传输文件 思路: # 先将报头转换成字符串(json.dumps), 再将字符 ...

  4. 采用socket传输文件

    采用socket传输文件 客户端输入文件的地址,服务端判断文件存在,就将文件传输到客户端 package com.fly.socket; import java.io.BufferedInputStr ...

  5. [转]SOCKET通信中TCP、UDP数据包大小的确定

    TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...

  6. Java 学习笔记 网络编程 使用Socket传输文件 CS模式

    Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...

  7. Python Socket传输文件

    发送端可以不停的发送新文件,接收端可以不停的接收新文件. 例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_visio.rar,支持多并发,具体实现如下: 接收端: 方法一 ...

  8. Linux C++ TCP Socket传输文件或图片实例

    环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...

  9. Socket传输简单的信息以及粘包问题的解决

    一.简单的socket程序——传输简短文字: # -*- coding: utf-8 -*- # -*- Author: WangHW -*- import socket whw_client = s ...

随机推荐

  1. 武汉科技大学ACM :1001: A + B Problem

    Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...

  2. 解决SurfaceView设置透明造成覆盖其他组件的替代方案

    之前在项目里面绘制摇杆圆盘使用SurfaceView来实现,同时设置SurfaceView透明,但是这样会造成SurfaceView的组件会覆盖其他的组件,一般情况没有关系,而不一般的情况就是有类似上 ...

  3. CSS特殊性

    样式的优先级取决于特殊性,特殊性为0,0,0,0 Ø每个元素或伪元素选择器贡献特殊性为 0,0,0,1 Ø每个类.伪类或者属性选择器的特殊性为 0,0,1,0 Ø每个ID选择器的特殊性为 0,1,0, ...

  4. 将含有父ID的列表转成树

    我们知道数据库一般是以一个列表(id,pid)的形式保存树的.如何提取这棵树呢?最简单的方法就是根据pid循环查表.但是毫无疑问,这会产生巨大的数据库查询开销. 那么一般建议的方法是一次性将全部相关数 ...

  5. GCD 深入理解

    GCD 深入理解(一) 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Object ...

  6. FJ省队集训最终测试 T3

    思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图 X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每 ...

  7. KEIL的混合编程操作

    http://hi.baidu.com/txz01/item/21ad9d75913a7b28d7a89c12 这一篇来讲讲混合编程的问题,在网上找了一下,讲混合编程的文件章也有不少,但进行实例操作讲 ...

  8. 关于ActionBar的向下兼容

    1. Create a blank Android Project创建一个空的Android项目.a. 导入ActionBarCompat工程.ActionBarCompat的source code位 ...

  9. TaintDroid:智能手机监控实时隐私信息流跟踪系统(四)

    6      应用程序研究 款流行的应用程序是怎么使用用户敏感数据的.选取的应用程序可以根据相应的权限通过Internet获得各种各样的用户数据.我们研究发现三分之二的这些数据暴露了用户详细的地理位置 ...

  10. java I/O之装饰者模式

    装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 装饰者模式意图: 动态的给一个对象添加额外的职责.Decorato ...