网络消息格式化很多char,int,C ++转换

Networking message formatting a lot of char, int, converting in CC++

我正在做C++编程中的网络编程,作业要求我发送格式化的消息。

格式如下:

1
2
3
bits:    0.....15 16....31  
          update#  port#          
             Sever-IP

如你所见,第一行请我:

  • 将int转换为16位,使2个int组成32位。

  • 将xxx.xxx.xxx.xxx转换为32位。

  • 我使用的是UDP,所以我需要将这些信息放入char[],这是最困难的部分。在我的程序中,更新和端口是int,服务器IP地址是字符串。我怎样才能把它们转换成这些比特?

    以下是我的尝试:

  • 把它们扔成炭。但是,我需要把一个整数变成两个字符。

  • 把它们转换成一个字符串,然后再转换成string.c_str(),但它给了我一个4字节的指针。


  • 最简单的方法是为头创建这样的结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #pragma pack(push,1)

    struct header
    {
        unsigned short updateNumber;
        unsigned short port;
        unsigned long ip;
    };
    #pragma pack(pop)

    像这样使用:

    1
    2
    3
    4
    5
    6
    char *buffer = new char[sizeof(header)+sizeOfRemainingMessage];
    header *head = (header*)buffer;
    head->update = 1;
    head->port = 80;
    head->ip = // convert ip string to unsigned long*
    send(buffer);

    *要将IP字符串转换为无符号长字符串,请参阅inet_addr()。


    C++中的int或long int是4字节(32位),但它可以依赖于实现。使用sizeof运算符检查类型的大小。

    然后,您可以使用shift操作符将更新值和端口值依次放入其中。

    对于字符串,基本上是一样的:您必须将它分成四段,将每段转换成一个整数,并在一个长整型整数内移动正确数量的每段。