数据发送

挣扎中前行 2013-07-12 01:41:17


8 typedef struct
9 {
10 char head[4];
11 int cmd;
12 int size;
13 void *data;
14 char end[3];
15 }CMD, *PCMD;



data里存放的数据每次长度不一,空间堆分配,用socket通信发送数据,能否连同数据一次发送到服务器去?给点建议
...全文
133 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-12
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
挣扎中前行 2013-07-12
  • 打赏
  • 举报
回复
引用 6 楼 adlay 的回复:
[quote=引用 5 楼 zhenwo123 的回复:] [quote=引用 4 楼 adlay 的回复:] [quote=引用 2 楼 zhenwo123 的回复:] [quote=引用 1 楼 adlay 的回复:] 不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.
恩,那这样接受者如何确定该接受多长呢?[/quote] 先接收 sizeof(CMD) 这么长, 然后你 CMD 结构里面不是定义了 size 的吗, 根据这个 size 来看剩下的还有多长.[/quote] char*buf=malloc(cmd_info->size); memset(buf,0,cmd_info->size); memcpy(buf, cmd_info->data, cmd_info->size); buf里只收到第一个字节呢?[/quote] 你的 cmd_info->size 等于多少? 要看内存, 不要看字符串, 你的结构体中间或许有 0, 字符串就截断了, 但是后面的内存还是有效的.[/quote] 我知道了要收取俩次,链接通道里有数据就不会阻塞! err = recv(sd, cmd_info, sizeof(CMD)-1, 0); err = recv(sd, buf, cmd_info->size, 0);
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
引用 5 楼 zhenwo123 的回复:
[quote=引用 4 楼 adlay 的回复:] [quote=引用 2 楼 zhenwo123 的回复:] [quote=引用 1 楼 adlay 的回复:] 不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.
恩,那这样接受者如何确定该接受多长呢?[/quote] 先接收 sizeof(CMD) 这么长, 然后你 CMD 结构里面不是定义了 size 的吗, 根据这个 size 来看剩下的还有多长.[/quote] char*buf=malloc(cmd_info->size); memset(buf,0,cmd_info->size); memcpy(buf, cmd_info->data, cmd_info->size); buf里只收到第一个字节呢?[/quote] 你的 cmd_info->size 等于多少? 要看内存, 不要看字符串, 你的结构体中间或许有 0, 字符串就截断了, 但是后面的内存还是有效的.
挣扎中前行 2013-07-12
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
[quote=引用 2 楼 zhenwo123 的回复:] [quote=引用 1 楼 adlay 的回复:] 不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.
恩,那这样接受者如何确定该接受多长呢?[/quote] 先接收 sizeof(CMD) 这么长, 然后你 CMD 结构里面不是定义了 size 的吗, 根据这个 size 来看剩下的还有多长.[/quote] char*buf=malloc(cmd_info->size); memset(buf,0,cmd_info->size); memcpy(buf, cmd_info->data, cmd_info->size); buf里只收到第一个字节呢?
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
引用 2 楼 zhenwo123 的回复:
[quote=引用 1 楼 adlay 的回复:] 不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.
恩,那这样接受者如何确定该接受多长呢?[/quote] 先接收 sizeof(CMD) 这么长, 然后你 CMD 结构里面不是定义了 size 的吗, 根据这个 size 来看剩下的还有多长.
挣扎中前行 2013-07-12
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.
恩,那这样接受者如何确定该接受多长呢?
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
不能. 得分两次发. 可以改成这样: typedef struct 9 { 10 char head[4]; 11 int cmd; 12 int size; 14 char end[3]; 13 char data[1]; // 变长, 某些编译器支持写成 data[0] 15 }CMD, *PCMD; PCMD p = malloc(sizeof(CMD) - 1 + data 的长度) 这种就可以一次发, 但是别用 sizeof, 用你 malloc 的大小.

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧