C++ SOCKET发送STRUCT结构体

要发送的结构体:
typedef struct Test
{
int aa;
char bb[100];
char cc[900];
}t_Test;

初始化要发送信息。对于字符串请用_snprintf方法
t_Test tt;
tt.aa=456;
_snprintf ( tt.bb, sizeof(tt.bb),
“Hello, ID Welcome to login” );
_snprintf ( tt.cc, sizeof(tt.cc),
“Adfadfasdfadfasdfadfasdfadfasd”);

发送信息
Sock.SendChunk(&tt,sizeof(t_Test),0);

————————————————————
服务器端:

int nRecvBytes = Receive ( szRecvBuffer, sizeof(szRecvBuffer) );
if (nRecvBytes>0)
{
t_Test tt;
memcpy(&tt,szRecvBuffer,nRecvBytes);
printf(“server收到数据aa=%d\nbb=%s\ncc=%s”,tt.aa,tt.bb,tt.cc);
}

需要注意的是这个方法发送的结构体大小一定不能超过你设定的缓存大小,超过了的话就会分成两次发送,到了服务器端就会出问题。比如缓存大小是1024B,结构体大小为1124B,服务器接收的时候会先收到1024B的信息,但是这个信息并不是完整的一个结构体,还有100B的内容将会在第二个包里面发送过来。到了服务器端需要组装,而照现在这种写法除非我们能在发送的时候智能标记让服务器端意识到内容大小超过1024,需要接收完后再组装结构体,不然就只有先发送一个包表示接下来的信息的类型和大小,服务器端收到信息后再进入组装处理程序分支。这个方法的极限缓存大小是1640B,再大就超过一个报文的大小了。

 

另外还有个很可行的方法,我还没实验过。

把struct串行化,就是变成二进制流,按位存储在char数组中,数组大小就是一个报文的缓存大小。数组的最后一位存放一个标记,表示后面还会有内容发送过来。这样服务器端接收信息直到接收到发送结束标记。最后把累计存下来的数据反串行化,就还原成了发送过来的struct了。  串行化我还能理解,反串行化我就没弄过了,不太懂

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在C++中向组播地址发送结构体数据,你需要使用套字(socket)编程。以下是一个简单的示例代码,演示如何发送结构体数据到组播地址: ```cpp #include <iostream> #include <cstring> #include <arpa/inet.h> #include <unistd.h> struct MyStruct { int id; float value; }; int main() { int sockfd; struct sockaddr_in addr; struct ip_mreq mreq; // 创建套字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); return 1; } // 设置套字选项,允许发送组播数据 int enable = 1; if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, &enable, sizeof(enable)) < 0) { perror("setsockopt"); close(sockfd); return 1; } // 设置组播地址和端口 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("组播地址"); // 替换成实际的组播地址 addr.sin_port = htons(端口号); // 替换成实际的端口号 // 绑定套字到组播地址 if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind"); close(sockfd); return 1; } // 加入组播组 mreq.imr_multiaddr.s_addr = inet_addr("组播地址"); // 替换成实际的组播地址 mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) < 0) { perror("setsockopt"); close(sockfd); return 1; } // 准备发送结构体数据 MyStruct data; data.id = 1; data.value = 3.14; // 发送结构体数据 if (sendto(sockfd, &data, sizeof(data), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("sendto"); close(sockfd); return 1; } // 关闭套字 close(sockfd); return 0; } ``` 在上述代码中,你需要替换 "组播地址" 和 "端口号" 为实际的组播地址和端口号。此代码创建一个UDP套字,并使用 `setsockopt` 设置套字选项以允许发送组播数据。然后,使用 `bind` 绑定套字到组播地址,并使用 `setsockopt` 加入组播组。最后,通过 `sendto` 函数发送结构体数据到组播地址。 请注意,此代码仅演示了发送结构体数据的基本过程,你可能需要根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值