c语言发送结构体 文件

举报
风吹稻花香 发表于 2022/01/10 22:23:22 2022/01/10
【摘要】 Linux C Socket编程发送结构体、文件详解及实例 利用Socket发送文件、结构体、数字等,是在Socket编程中经常需要用到的。由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件、结构体、数字等等。 本文:Linux C Socket编程发送结构体、文件详解及实例 - 旭东的博客 - 博客园 1....

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;

服务器代码:


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

客户端代码:


  
  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. #define MYPORT 6666
  13. #define BUFFER_SIZE 1024
  14. typedef struct
  15. {
  16. int ab;
  17. int num[1000000];
  18. }Node;
  19. int main()
  20. {
  21. ///sockfd
  22. int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
  23. struct sockaddr_in servaddr;
  24. memset(&servaddr, 0, sizeof(servaddr));
  25. servaddr.sin_family = AF_INET;
  26. servaddr.sin_port = htons(MYPORT);
  27. servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  28. if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
  29. {
  30. perror("connect");
  31. exit(1);
  32. }
  33. Node *myNode=(Node*)malloc(sizeof(Node));
  34. myNode->ab=123;
  35. myNode->num[0]=110;
  36. myNode->num[999999]=99;
  37. int needSend=sizeof(Node);
  38. char *buffer=(char*)malloc(needSend);
  39. memcpy(buffer,myNode,needSend);
  40. int pos=0;
  41. int len=0;
  42. while(pos < needSend)
  43. {
  44. len=send(sock_cli, buffer+pos, BUFFER_SIZE,0);
  45. if(len <= 0)
  46. {
  47. perror("ERRPR");
  48. break;
  49. }
  50. pos+=len;
  51. }
  52. free(buffer);
  53. free(myNode);
  54. close(sock_cli);
  55. printf("Send over!!!\n");
  56. return 0;
  57. }

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/122389318

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。