【问题标题】:send struct with pointer char over UDP socket in c linux module在c linux模块中通过UDP套接字发送带有指针字符的结构
【发布时间】:2012-07-05 16:44:45
【问题描述】:

我必须通过 udp 套接字在两台机器之间发送一个结构 我需要的信息是发送如下结构:

unsigned long x;

unsigned long y;

char *buf;

我必须一次性发送结构体。

我的问题是:我如何处理这个结构,例如,设置一个我可以通过套接字发送的变量,特别是变量 buf 的大小不固定

感谢您的帮助

【问题讨论】:

    标签: linux sockets module udp send


    【解决方案1】:

    您不能发送指针,在您的进程空间之外没有任何意义。相反,您必须对其进行序列化,即复制到一个数组并发送它。在字符串之前,您还需要存储它的长度。你可以试试:

    char sendbuf[...];
    int len = strlen(buf);
    
    memcpy(sendbuf, &x, sizeof(x));
    memcpy(sendbuf + sizeof(x), &y, sizeof(y));
    memcpy(sendbuf + ..., &len, sizeof(len));
    
    memcpy(sendbuf + ..., buf, len);
    

    【讨论】:

    • 非常感谢您的回答,但是当服务器收到sendbuf时,我如何才能得到原始数据,x,y,以及buf的值..
    • @user1503486 使用memcpy 镜像这些操作。
    【解决方案2】:

    您需要将结构中的所有内容按顺序复制到单独的字符缓冲区中,然后将其写入套接字。 (可选)由于结构中的 char* 缓冲区不是固定长度的,因此计算要发送的内容的大小并在消息开头将其写为整数通常是一个好主意,以便在另一端您发送的数据包的长度可以通过您的接收套接字进行验证。

    在另一端解压数据时,只需从接收缓冲区的开头开始,然后将 memcpy 数据放入您的值中

    char* 消息; // 这是指向你的开始的指针 // 接收到的消息缓冲区

    // TODO: assign message to point at start of your received buffer.
    
    
    unsigned long xx;
    unsigned long yy;
    memcpy(&xx,message,sizeof(unsigned long));  // copy bytes of message to xx
    message += sizeof(unsigned long);           // move pointer to where yy SHOULD BE 
                                                // within your packet    
    memcpy(&yy,nessage,sizeof(unsigned long));  // copy bytes to yy
    message += sizeof(unsigned long);           // message now points to start of 
                                                // the string part of your message
    
    int iStringLength =   //  ?????? You need to calculate length of the string
    char tempBuffer[1000]; // create a temp buffer this is just for illustration
                           // as 1000 may not be large enough - depends on how long
                           // the string is
    memcpy(tempBuffer,message,iStringLength);
    

    然后 xx,yy 包含您的 long 值,而 tempBuffer 包含字符串。如果您希望字符串在当前范围之外持续存在,那么您需要分配一些内存并将其复制到那里。您可以从整个消息的大小减去 2 个无符号长项的大小来计算此字符串的大小(或者如果您按照我上面的建议进行操作,则使用数据包中发送的额外项)。

    我希望这可以阐明您需要做什么

    【讨论】:

    • 谢谢你的回答,能不能举个例子
    • 感谢您的回答,我会尽力告诉您,祝您有美好的一天
    • 在测试了你给我的代码后,我发现它在两个变量的情况下工作,但是第三个类型 *char 我无法恢复它,这是代码:memcpy(&offset,p,sizeof(unsigned long));@ 987654323@ memcpy(&nbytes,p,sizeof(unsigned long)); p+=sizeof(unsigned long); 然后如果我打印 p 它会给一个垃圾我不知道为什么,也许 udp 在发送时向套接字添加了一些东西?提前感谢您的帮助
    • @user1503486 我又添加了一些。如果您无法理解从这里该怎么做,恐怕我无法再帮助您了。我无法为您编写整个代码。如果这还不够,那么我建议你买一本好书,或者也许其他人会为你提供逐行代码。我认为这里的两个答案都为您提供了足够的信息来解决您的问题。
    • 非常感谢,终于成功了,感谢您的帮助.....给我带来的不便,我很抱歉,我不太熟悉c
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2015-01-02
    相关资源
    最近更新 更多