我有以下结构:
struct Packet
{
int seqNum;
int ackNum;
int numBytes;
char* payload;
};
我想通过UDP发送。我现在这样做:
struct Packet p = {1,0,8,"testing"};
int payloadSize = p.numBytes;
char* payload = (char*)malloc(payloadSize);
memcpy(payload, &p, payloadSize);
int bytesSent = sendto(mySocket, payload, payloadSize, 0,
(const struct sockaddr *)&toNode,length);
发送的字节数是正确的 - 但数据是乱码。我做错了吗?在接收器大小上,我做了类似的事情:
int n;
char buffer[MTU];
bzero(buffer,MTU );
unsigned int length = sizeof(struct sockaddr_in);
struct sockaddr_in from;
n = recvfrom(mySocket,buffer,1472,0,(struct sockaddr *)&from, &length);
if (n < 0)
perror("recvfrom");
else
{
cout << "Recieved " << n << " bytes of data\n-|-\n";
char* seqNum = (char*)malloc(sizeof(int));
memcpy(seqNum, &buffer, 4);
cout << "SeqNum: " << seqNum << endl;
}
输出
Received 8 bytes of data
SeqNum: [garbage]
答案 0 :(得分:3)
你的结构中有char*
......
你必须创建(动态)一个能够包含3个int的缓冲区和字符串的字符,组成它(strcpy)并发送缓冲区。
在下面的评论中回答OP问题
稳定解决方案需要考虑的一些事项:对于2个或更多字节的整数:你应该总是使用网络顺序,而不是&#34;你的&#34;的结尾。系统。对于char [],有几点需要考虑:编码,以长度(1,2,4字节整数)或尾随0字节为前缀。 - 另请参阅ASN.1或谷歌TLV(类型,长度,值)。 - 你可以通过XML或JSON来避免所有这些。
答案 1 :(得分:2)
char *
字段有意义的?它将发送指针的值,但不发送任何字符。显然,这对接收者来说是无用的,接收者无法通过网络将指针跟回到您的过程中。存储器中。你需要对数据进行适当的序列化,你不能只是将原始结构转储出去。