通过UDP套接字转移结构的麻烦

时间:2014-04-25 05:40:44

标签: c++ c sockets udp memcpy

我有以下结构:

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]

2 个答案:

答案 0 :(得分:3)

你的结构中有char* ......

你必须创建(动态)一个能够包含3个int的缓冲区和字符串的字符,组成它(strcpy)并发送缓冲区。

在下面的评论中回答OP问题

稳定解决方案需要考虑的一些事项:对于2个或更多字节的整数:你应该总是使用网络顺序,而不是&#34;你的&#34;的结尾。系统。对于char [],有几点需要考虑:编码,以长度(1,2,4字节整数)或尾随0字节为前缀。 - 另请参阅ASN.1或谷歌TLV(类型,长度,值)。 - 你可以通过XML或JSON来避免所有这些。

答案 1 :(得分:2)

  1. 发送二进制结构&#34; raw&#34;这是一个坏主意。通过网络。您不能相信接收者的编译器以完全相同的方式布置了结构。
  2. 您是如何期望char *字段有意义的?它将发送指针的值,但不发送任何字符。显然,这对接收者来说是无用的,接收者无法通过网络将指针跟回到您的过程中。存储器中。
  3. 你需要对数据进行适当的序列化,你不能只是将原始结构转储出去。