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

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

本文:Linux C Socket编程发送结构体、文件详解及实例 - 旭东的博客 - 博客园

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;

服务器代码:

#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define HELLO_WORLD_SERVER_PORT    6666
#define LENGTH_OF_LISTEN_QUEUE     20
#define BUFFER_SIZE                1024typedef struct
{int ab;int num[1000000];
}Node;int main(int argc, char **argv)
{// set socket's address informationstruct sockaddr_in   server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);// create a stream socketint server_socket = socket(PF_INET, SOCK_STREAM, 0);if (server_socket < 0){printf("Create Socket Failed!\n");exit(1);}//bindif (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr))){printf("Server Bind Port: %d Failed!\n", HELLO_WORLD_SERVER_PORT);exit(1);}// listenif (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)){printf("Server Listen Failed!\n");exit(1);}while(1){struct sockaddr_in client_addr;socklen_t          length = sizeof(client_addr);int new_server_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);if (new_server_socket < 0){printf("Server Accept Failed!\n");break;}Node *myNode=(Node*)malloc(sizeof(Node));int needRecv=sizeof(Node);char *buffer=(char*)malloc(needRecv);int pos=0;int len;while(pos < needRecv){len = recv(new_server_socket, buffer+pos, BUFFER_SIZE, 0);if (len < 0){printf("Server Recieve Data Failed!\n");break;}pos+=len;}close(new_server_socket);memcpy(myNode,buffer,needRecv);printf("recv over ab=%d num[0]=%d num[999999]=%d\n",myNode->ab,myNode->num[0],myNode->num[999999]);free(buffer);free(myNode);}close(server_socket);return 0;
}

客户端代码:

 #include <sys/types.h>#include <sys/socket.h>                         // 包含套接字函数库#include <stdio.h>#include <netinet/in.h>                         // 包含AF_INET相关结构#include <arpa/inet.h>                      // 包含AF_INET相关操作的函数#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/shm.h>#include <pthread.h>#define MYPORT  6666#define BUFFER_SIZE 1024typedef struct{int ab;int num[1000000];}Node;int main(){///sockfdint sock_cli = socket(AF_INET,SOCK_STREAM, 0);struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(MYPORT);servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){perror("connect");exit(1);}Node *myNode=(Node*)malloc(sizeof(Node));myNode->ab=123;myNode->num[0]=110;myNode->num[999999]=99;int needSend=sizeof(Node);char *buffer=(char*)malloc(needSend);memcpy(buffer,myNode,needSend);int pos=0;int len=0;while(pos < needSend){len=send(sock_cli, buffer+pos, BUFFER_SIZE,0);if(len <= 0){perror("ERRPR");break;}pos+=len;}free(buffer);free(myNode);close(sock_cli);printf("Send over!!!\n");return 0;}

c语言发送结构体 文件相关推荐

  1. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) 20180001 ...

  2. c语言send发送结构体,Socket编程中用send发送结构体

    Socket编程中用send发送结构体 原创 2010年04月28日 19:17:00 标签:socket /编程 /struct /google /string /input 11868 最近在开发 ...

  3. java发送c语言结构体_C语言中结构体直接赋值?

    在C语言中结构体变量之间可以进行赋值操作吗? 简单结构体的赋值 先说结论:一般来说,C语言中的结构体变量可以用另一个变量对其进行赋值或初始化.简单结构体(不包含指针成员)直接赋值没有问题. 我们先下面 ...

  4. c语言中结构体头文件是什么,函数形参里有结构体指针,为什么在头文件生

    满意答案 lam950 2017.04.08 采纳率:59%    等级:8 已帮助:913人 C语言用结构体指针作函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递 ...

  5. c语言中将结构体写入文件,C语言中将结构体写入文件

    可以使用fwrite()将一个结构体写入文件: fwrite(&some_struct,sizeof somestruct,1,fp); 对应的fread函数可以再把它读出来,此处fwrite ...

  6. Linux下Socket编程中用send发送结构体

    转自:http://tech.ddvip.com/2008-10/122543769687623.html Linux网络通信 Linux下多客户端聊天软件 Linux程序设计 Linux socke ...

  7. java接收c语言的结构体

    java接收c语言的结构体 DataInputStream inputStream = new DataInputStream(s.getInputStream()); int read = 0; i ...

  8. c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

    #include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...

  9. c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧

    单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...

最新文章

  1. Web应用架构-Nginx
  2. sql 使用视图的好处
  3. 网站本地测试安装流程
  4. HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式...
  5. python下载word文件-python-docx操作word文件(*.docx)
  6. php 安装redis php扩展
  7. ACM中Java输入输出
  8. python中引用上层路径
  9. 深度学习和目标检测系列教程 15-300:在 Python 中使用 OpenCV 执行 YOLOv3 对象检测
  10. ugly number
  11. LeetCode 396. 旋转函数(数学)
  12. linux 物理内存用完了_调整linux内核尽量用内存,而不用swap
  13. ext2.0 主体皮肤 (xtheme-black)
  14. 注入点批量收集工具_如何批量处理短视频,剪辑片头片尾、加图片水印
  15. 干净虚拟机(centos 6.4)上从头到尾安装并调试Mdrill(四)
  16. SAP License:无师自通学SAP-开篇
  17. 手机应用只清理不够,还要卸载
  18. 深度学习之图像分类(七)--ResNet网络结构
  19. [渝粤教育] 南京审计大学 审计学基础 参考 资料
  20. 分解质因数_java

热门文章

  1. python3 环境变量
  2. Android开发工具——ADB(Android Debug Bridge) 二HOST端
  3. Centos7.2部署DHCP服务
  4. linux 组调度浅析
  5. Paste模块的世界
  6. 定义一个不能被拷贝的类
  7. 查看OpenStack版本
  8. java导出highcharts_java实现highcharts导出图片至excel
  9. c++ 初始化 代码 应放在那里_Go语言goroutine调度器初始化 (12)
  10. linux 有线网卡,linux下有线网卡出现ADDRCONF(NETDEV_UP): eth0: link is not ready的解决方法...