gpt4 book ai didi

c - 在 C 中通过 TCP 套接字传递结构

转载 作者:行者123 更新时间:2023-12-01 13:01:08 25 4
gpt4 key购买 nike

我正在用 C 编写一个小型客户端服务器应用程序。

在客户端,我有一种结构,

#pragma pack(1)   // this helps to avoid serialization while sending over network. 
typedef struct _viewBoxClient_Info
{
unsigned long viewBoxID;
int bRT_flag;
int nFrameNum;
char frameData[1000];
}viewBoxClient_info_send ;
#pragma pack(0) // turn packing off

并将变量填充为,

struct _viewBoxClient_Info client_info;
client_info.bRT_flag= 10;/*0 for false, 1 for true*/
client_info.viewBoxID=10000;
memcpy(client_info.frameData,buf,sizeof(client_info.frameData)); //char buf[] data is "is 1st line"
client_info.nFrameNum=1;

并使用以下函数发送到服务器,

send(sock, (char *)&client_info, bytesRead, 0);

在服务器端,我有一种结构(与客户端结构相同),

#pragma pack(1)   // this helps to avoid serialization while sending over network.
typedef struct _lclviewBoxClient_Info
{
unsigned long viewBoxID;
int bRT_flag;
int nFrameNum;
char frameData[1000];
}viewBoxClient_info_receive ;
#pragma pack(0) // turn packing off

接收消息并打印在屏幕上,

viewBoxClient_info_receive lcl_viewBox;
ssize_t bytesReceived = recv( *nfd, &lcl_viewBox, sizeof(struct _lclviewBoxClient_Info), 0);
printf("\nlcl_viewBox.bRT_flag:%d\n",lcl_viewBox.bRT_flag);
printf("lcl_viewBox.nFrameNum:%d\n",lcl_viewBox.nFrameNum);
printf("lcl_viewBox.frameData:%s\n",lcl_viewBox.frameData);

O/p 在服务器屏幕上,

 lcl_viewBox.bRT_flag:1
lcl_viewBox.nFrameNum:1936287860
lcl_viewBox.frameData: is 1st line

我不知道我的服务器端到底发生了什么。我从客户端发送 10 个 bRT_flag 并在服务器接收 1 个。还从客户端发送 nFrameNum=1 并在服务器接收 nFrameNum:1936287860。 frameData 也在客户端发送“这是第一行”,而在服务器上只接收“是第一行”。有人会帮忙解决这个问题吗?

感谢和问候,

斯里兰卡

最佳答案

不应该这样:

send(sock, (char *)&client_info, bytesRead, 0);

成为:

send(sock, (char *)&client_info, sizeof( client_info ), 0);

并且您应该检查 send() 的返回值,尤其是 recv() 的返回值 - 不能保证对 recv 的调用会一次性获取您的结构。

关于c - 在 C 中通过 TCP 套接字传递结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5962443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com