利用Socket发送文件、结构体、数字等,是在Socket编程中经常需要用到的。由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件、结构体、数字等等。

本文:http://www.cnblogs.com/xudong-bupt/p/3496741.html

1.memcpy

  Copy block of memory。内存块拷贝函数,该函数是标准库函数,可以进行二进制拷贝数据。

  函数原型: void * memcpy ( void * destination, const void * source, size_t num );

  函数说明:从source指向的地址开始拷贝num个字节到以destination开始的地址。其中destination与source指向的数据类型无关。

2.Socket传输

  使用memcpy将文件、结构体、数字等,可以转换为char数组,之后进行传输,接收方在使用memcpy将char数组转换为相应的数据。

下面的程序使用Socket传输结构体数据,由客户端传输给服务器端。

传输的结构体为:

typedef struct
{int ab;int num[1000000];
}Node;

服务器代码:

 1 #include<netinet/in.h>
 2 #include<sys/types.h>
 3 #include<sys/socket.h>
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 #include<string.h>
 7
 8 #define HELLO_WORLD_SERVER_PORT    6666
 9 #define LENGTH_OF_LISTEN_QUEUE     20
10 #define BUFFER_SIZE                1024
11
12 typedef struct
13 {
14     int ab;
15     int num[1000000];
16 }Node;
17
18 int main(int argc, char **argv)
19 {
20     // set socket's address information
21     struct sockaddr_in   server_addr;
22     bzero(&server_addr, sizeof(server_addr));
23     server_addr.sin_family = AF_INET;
24     server_addr.sin_addr.s_addr = htons(INADDR_ANY);
25     server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
26
27     // create a stream socket
28     int server_socket = socket(PF_INET, SOCK_STREAM, 0);
29     if (server_socket < 0)
30     {
31         printf("Create Socket Failed!\n");
32         exit(1);
33     }
34
35     //bind
36     if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
37     {
38         printf("Server Bind Port: %d Failed!\n", HELLO_WORLD_SERVER_PORT);
39         exit(1);
40     }
41
42     // listen
43     if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
44     {
45         printf("Server Listen Failed!\n");
46         exit(1);
47     }
48
49     while(1)
50     {
51         struct sockaddr_in client_addr;
52         socklen_t          length = sizeof(client_addr);
53
54         int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
55         if (new_server_socket < 0)
56         {
57             printf("Server Accept Failed!\n");
58             break;
59         }
60
61         Node *myNode=(Node*)malloc(sizeof(Node));
62
63         int needRecv=sizeof(Node);
64         char *buffer=(char*)malloc(needRecv);
65         int pos=0;
66         int len;
67         while(pos < needRecv)
68         {
69             len = recv(new_server_socket, buffer+pos, BUFFER_SIZE, 0);
70             if (len < 0)
71             {
72                 printf("Server Recieve Data Failed!\n");
73                 break;
74             }
75             pos+=len;
76
77         }
78         close(new_server_socket);
79         memcpy(myNode,buffer,needRecv);
80         printf("recv over ab=%d num[0]=%d num[999999]=%d\n",myNode->ab,myNode->num[0],myNode->num[999999]);
81         free(buffer);
82         free(myNode);
83     }
84     close(server_socket);
85
86     return 0;
87 }

View Code

客户端代码:

 1 #include <sys/types.h>
 2 #include <sys/socket.h>                         // 包含套接字函数库
 3 #include <stdio.h>
 4 #include <netinet/in.h>                         // 包含AF_INET相关结构
 5 #include <arpa/inet.h>                      // 包含AF_INET相关操作的函数
 6 #include <unistd.h>
 7 #include <string.h>
 8 #include <stdlib.h>
 9 #include <fcntl.h>
10 #include <sys/shm.h>
11 #include <pthread.h>
12
13 #define MYPORT  6666
14 #define BUFFER_SIZE 1024
15
16 typedef struct
17 {
18     int ab;
19     int num[1000000];
20 }Node;
21
22 int main()
23 {
24         ///sockfd
25     int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
26
27     struct sockaddr_in servaddr;
28     memset(&servaddr, 0, sizeof(servaddr));
29     servaddr.sin_family = AF_INET;
30        servaddr.sin_port = htons(MYPORT);
31     servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
32
33     if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
34     {
35         perror("connect");
36         exit(1);
37     }
38
39     Node *myNode=(Node*)malloc(sizeof(Node));
40     myNode->ab=123;
41     myNode->num[0]=110;
42     myNode->num[999999]=99;
43
44     int needSend=sizeof(Node);
45     char *buffer=(char*)malloc(needSend);
46     memcpy(buffer,myNode,needSend);
47
48     int pos=0;
49     int len=0;
50     while(pos < needSend)
51     {
52         len=send(sock_cli, buffer+pos, BUFFER_SIZE,0);
53         if(len <= 0)
54         {
55             perror("ERRPR");
56             break;
57         }
58         pos+=len;
59     }
60     free(buffer);
61     free(myNode);
62     close(sock_cli);
63     printf("Send over!!!\n");
64     return 0;
65 }

View Code

服务器端执行输出:

Linux C Socket编程发送结构体、文件详解及实例相关推荐

  1. go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别

    入门示例 package main import "fmt" //定义老师结构体,将老师中的各个属性 统一放入结构体中管理: type Teacher struct{//变量名字大 ...

  2. C语言结构体struct详解与实例

    目录 1.定义 2.应用 2.1初始化 2.2使用 3.结构体对齐规则与存储 1.定义 C语言中结构体(struct关键字定义)是一种自定义数据类型.通过结构体的定义可以将多种不同类型数据形成一个组合 ...

  3. c语言发送结构体 文件

    Linux C Socket编程发送结构体.文件详解及实例 利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式 ...

  4. (15)System Verilog结构体struct详解

    (15)System Verilog结构体struct详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog结构体struct详解 5) ...

  5. 红帽linux 系统日志,RedHat系统常见的日志文件详解一

    RedHat系统常见的日志文件详解一 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息.% @7 h7 s, Y5 z! V' h- ...

  6. socket编程--sockaddr_in结构体操作

    sockaddr结构体 sockaddr的缺陷: struct sockaddr是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind(),connect() ...

  7. C 结构体 struct 详解

    数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为 ...

  8. C语言——结构体(入门详解)

    结构体 文章目录 结构体 1.结构体的引出 2.结构体与结构体变量的关系示意图 3.**快速入门面向对象的方式(struct)解决养猫问题** 4.结构体和结构体变量的区别和联系 5.结构体变量在内存 ...

  9. 结构体+联合体 详解

    文章目录 一.结构体 1.结构体变量 2.特殊声明 3.结构体的引用 1.嵌套调用 2.自引用 三.结构体的初始化 四.结构体的内存对齐 1.用法 2.练习题 3.修改对齐数 五.位段 1.用法 2. ...

最新文章

  1. 谷歌最新的PlaNet对强化学习以及迁移学习的意义及启发
  2. cas无法使用_并发编程中cas的这三大问题你知道吗?
  3. mysql表数据以本地文件方式导入Hive
  4. 【文件系统】删除文件名中含有空格的文件
  5. etl数据抽取工具_数据同步工具ETL、ELT傻傻分不清楚?3分钟看懂两者区别
  6. Android UI布局—— 仿QQ登录界面
  7. python中的return和print的区别_python中return和print的区别(详细)
  8. easyswoole数据库连接池_EasySwoole使用Mysqli
  9. Xposed从入门到弃坑:0x03、XposedHelpers类解析
  10. PHP foreach如何判断是数组最后一个元素
  11. 7.8 一阶常系数线性方程
  12. 负载均衡获得真实源IP的6种方法 【转】
  13. 车载与体征/手势检测 毫米波雷达信号处理流程
  14. 博士申请 | 香港大学计算机科学系黄超老师招收2022年入学全奖博士生
  15. UCenter Home 正式开源 促进国内SNS网站发展
  16. Java main是什么_java中的public static void main是什么意思
  17. Express-get和post
  18. Kivy App开发之页面背景设置
  19. 国考计算机及其应用科目,2018国家公务员考试专业科目考试大纲(计算机类)
  20. 《通过PMBOK看项目管理软件》交流活动

热门文章

  1. TFS与Eclipse、Microsoft Visual Studio等客户端以webservice进行交换。
  2. UiPickerView基本使用方法
  3. LUA 拾遗(编译-调试-运行)
  4. 记录各种体育活动(持续更新到不更新为止)
  5. firefox 开发sdk
  6. 高精度倾斜摄影建模解决方案
  7. RSA javascript加密 lua解密
  8. mongodb 启动方法
  9. servlet web.xml学习笔记
  10. homework1: 印象深刻的错误