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

时间:2012-05-14 10:17:25

标签: c string unix struct 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;

导致编译器错误。

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

谢谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

  1. 为什么要提到要发送的缓冲区大小为100?应该是sizeof(struct Header),假设您希望始终发送100个字节的有效负载。
  2. 如果您在网络中发送整数变量而未将其转换为“网络顺序”,则在接收并在另一侧分配它们时,您可能会得到不正确的值,除非两台计算机具有相同的字节顺序
  3. 所以,我的建议是你将它们全部转换成一个缓冲区并将其发送到接收解码缓冲区到结构时。

    制作发送记录的示例方式:

    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)); 
    

    当您从网络收到缓冲区时,请执行与此相反的操作。希望这会有所帮助。

答案 2 :(得分:0)

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

服务器:

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

客户端:

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

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

如果要发送可变大小的包,则会更复杂。