sock通信--数据结构的传送

来源:互联网 发布:数据的挖掘用于工作 编辑:程序博客网 时间:2024/05/16 13:57

  sock通信中有几个问题必须注意,由于标准的不统一,有的机器使用的大端存储,而有的机器使用的是小端存储(如果对大小端不了解可以上网搜寻一下相关信息). 我们的机器的存储方式各不相同,但是由于历史原因,网络字节序使用的是大端,也就是说,我们要通过网络传输信息到远断,我们要当心了.

  如果明确了传送信息的双方都是相同的存储方式那么还好办,如果传送双方的存储方式不相同或者不一定相同,我们就必须把发送的数据进行相应的格式转换再发送到网络上,直至远端.

  由于网络字节序是大端,那么,我们再发送一个数据结构时,需要把这个结构中的每个成员转换成网络字节序,再发送到远端,而不只是简单的发送这些数据给远端.

  下面是我在发送数据结构时使用的一些例程,希望对涉及到这方面的朋友有帮助.

  在这个例子中,我定义了一个这样的结构体进行传送

 


typedef struct
{
    uint16_t packetlen;
    uint8_t cmdtype;
    uint16_t sessionid;
    uint16_t messageid;
    uint32_t ackinfo;
} ControlHeader;


  定义了这些函数处理结构体中的成员,把他们转换成相应的格式存入缓存中
//
//basic convert funtion declaration
//
void SendUint32_tToBuff(char *buf, uint32_t n);
void SendUint16_tToBuff(char *buf, uint16_t n);
void SendStringToBuff(char *buf, char *str);
uint32_t GetUint32_tFromBuff(char *buf);
uint16_t GetUint16_tFromBuff(char *buf);

//
//structure convert function declaration
//
void init_ControlHeader(uint8_t type, uint16_t sid, uint16_t mid,
uint32_t ack, ControlHeader *pHead);
void sendHeadtobuff(char *buf, ControlHeader *pHead);
void getHeaderfrombuff(void *buff, ControlHeader *p);
int getHeadlen();

  上述定义存放在struct.h文件中,另外写了一个struct.c对上述声明进行定义 

 

  下面我们写一个简单的网络通信例程,进行试验

  服务器端

 

客户端

 

完毕.

 

原创粉丝点击