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

简介: 利用Socket发送文件、结构体、数字等,是在Socket编程中经常需要用到的。由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件、结构体、数字等等。 本文:http://www.cnblogs.com/xudong-bupt/p/3496741.html 1.memcpy   Copy block of memory。

利用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

服务器端执行输出:

相关文章
|
23天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
55 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
9天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
67 14
|
8天前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
34 6
|
10天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
48 6
|
2月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
44 5
|
2月前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
55 6
|
2月前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
133 6
|
3月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
34 0
|
6月前
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
66 4
|
6月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
40 3