【问题标题】:How to load a string to a structure?如何将字符串加载到结构中?
【发布时间】:2012-05-14 10:17:24
【问题描述】:

我有一个客户端和一个服务器。我使用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;

导致编译器错误。

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

谢谢!

【问题讨论】:

  • 假设 angel 是 struct Header *angel。 angel = (struct Header *)recvline;

标签: c string unix struct structure


【解决方案1】:

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;

【讨论】:

  • 在编写任何形式的通信协议时使用 sizeof(struct_type) 通常是个坏主意,因为这意味着填充字节也会被发送。
【解决方案2】:

如果您想发送固定尺寸的包裹。那么这可能是解决方案:

服务器:

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

客户:

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

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

如果你想发送可变大小的包裹,那就更复杂了。

【讨论】:

    【解决方案3】:

    我猜你在这里遇到了一些问题。

    1. 为什么提到要发送的缓冲区大小为 100?它应该是 sizeof(struct Header) 假设您要始终发送 100 字节的有效负载。
    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)); 
    

    当您从网络接收缓冲区时,只需执行相反的操作。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 2020-07-26
      • 2021-11-15
      • 2020-01-30
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多