繁体   English   中英

如何将字符串加载到结构?

[英]How to load a string to a structure?

我有一个客户端和一个服务器。 我使用UDP。 (C / Unix)

在服务器中,我确实有一个结构:

typedef struct Header {
int seqid;
int len;
char payload[100];
}
...
char test[100];
struct Header package;
package.seqid = 1;
package.len = 64;
strcpy(package.payload, test);
sendto(sockfd, &package, 100, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

在客户端中,我确实具有相同的结构:

struct Header* myrepos;
...
recvfrom(sockfd, recvline, 100, 0, NULL, NULL);
//recvline is a char[100]
...

我想将提交的结构(由服务器提交)加载到“ myrepos”中。 我怎样才能做到这一点?

用一个

*angel = (struct Header*)&recvline;

导致编译器错误。

我不确定我的方法是否正确或是否会发生。 还有其他解决方案吗?

谢谢!

1: sendto(sockfd, &package, sizeof(struct Header), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

2: recvline = new char [sizeof(struct Header)];

3: myrepos = (struct Header *)recvline;

我想您在这里遇到了几个问题。

  1. 您为什么提到要发送的缓冲区大小为100? 假设您要始终发送100字节的有效负载,则它应该为sizeof(struct Header)。
  2. 如果您在网络中按原样发送整数变量,而在接收并在另一端分配它们时不将其转换为“网络顺序”,则除非两个机器的字节序相同,否则可能会得到不正确的值。

因此,我的建议是将它们全部转换为缓冲区,并在接收到缓冲区并将其解码为结构时将其发送出去。

记录发送记录的示例方法:

char sbuf[100] = {0};
char test[100] = {"Test Message"};
char *p = sbuf;
int bytestobesent = 0;

p = htonl(1);
p = p+sizeof(long);
p = htonl(64);
p = p+sizeof(long);
memcpy(p, test, strlen(test));

bytestobesent = sizeof(long) + sizeof(long) + strlen(test);

sendto(sockfd, sbuf, bytestobesent , 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr)); 

当您从网络收到缓冲区时,只需执行相反的操作即可。 希望这可以帮助。

如果要发送固定大小的包裹。 然后这可能是解决方案:

服务器:

sendto(sockfd, &package, sizeof(package), 0, 
       (struct sockaddr*)&cliaddr, sizeof(cliaddr));

客户:

struct Header myrepos;
...
recvfrom(sockfd, &myrepos, sizeof(myrepos), 0, NULL, NULL);

当然,您必须检查函数的返回码。

如果要发送可变大小的程序包,它将更加复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM