0

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

导致编译器错误。

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

谢谢你!

4

3 回答 3

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;

于 2012-05-14T10:31:54.473 回答
0

我猜你在这里有几个问题。

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

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

于 2012-05-14T10:48:12.670 回答
0

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

服务器:

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

客户:

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

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

如果你想发送可变大小的包裹,它会更复杂。

于 2012-05-14T11:34:49.277 回答