我有一个客户端和一个服务器。我使用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;
导致编译器错误。
我不确定我的方法是否正确或是否可能发生。 还有其他解决方案吗?
谢谢!
答案 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)
我猜你在这里遇到了一些问题。
所以,我的建议是你将它们全部转换成一个缓冲区并将其发送到接收解码缓冲区到结构时。
制作发送记录的示例方式:
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);
你必须检查函数的返回码。
如果要发送可变大小的包,则会更复杂。