【发布时间】:2013-09-09 02:01:15
【问题描述】:
如果以后有人遇到这个问题,我会留下这个。
*注意这种方法在从 C 客户端到 C 服务器时不起作用。这只适用于 Java 客户端到 C 服务器。所以我不得不放弃这种方法。
好吧,我已经和 C 吵了太久了。我正在使用 UDP 将一些信息从 java 客户端传递到 C 服务器。我可以在那里获取信息,但我不确定如何拆分消息以存储到这样的结构中
struct __attribute__((__packed__)) clientMessage
{
short tml;
short rid;
char op;
char message[MAXBUFLEN-5];
};
我收到这样的消息
其中 test 是 char test[MAXBUFLEN-5];
if ((numbytes = recvfrom(sockfd, test, MAXBUFLEN-1, 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);}
所以,我需要获取消息“7 2 1Yo”(两个 2 字节的短裤和一个字符,后跟一个未知的消息长度)并将其存储到结构中的适当部分。消息被正确发送,我只是无法将它分解成我需要的信息。我正在尝试
memcpy(&cm.rid, &test, 2);
memcpy(&cm.tml, &test[1], 2);
memcpy(&cm.op, &test[4], 1);
memcpy(&cm.message, &test[5], MAXBUFLEN-5);
但我的结果最终是
Message: Yo
OP: 1Yo
RID: 7 1Yo
TML: 2 7 1Yo
应该是的
Message: Yo
OP: 1
RID: 2
TML: 7
我成功收到了消息,但没有别的。我对C比较陌生,所以请原谅我的无知。我猜这真的很容易,但我想。
【问题讨论】:
-
//empty,你的意思是0吗?为什么不是char test[MAXBUFLEN]?为什么test的内容在你的结构中颠倒了rid和tml的顺序?您将一个指向数组的指针传递给memcpy()作为源地址(如果test是一个数组,但它的类型错误,您不会注意到差异)。如果您的意思是&test[0],您可以通过删除&来修复。不应该是memcpy(&cm.tml, &test[2], 2);吗? -
您考虑过字节序问题吗?另外,如果
rid和tml都是两个字节,你为什么要从&test[1]中memcpy-ing 到tml? -
为了理智起见,我还建议您对结构成员进行排序以匹配它们在网络流中出现的顺序。
-
您要打印什么?它不应该是 4 个十六进制数字,还是 5 个十进制数字(可能是负数)?我还是不明白空是什么意思。
-
暂时忘记它是空的。当我打印出整个字符“test”时,我发送的消息“7 2 1Yo”打印得很好。当试图从该字符中提取我需要的信息时,我得到了奇怪的结果。