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对上述声明进行定义
下面我们写一个简单的网络通信例程,进行试验
服务器端
客户端
完毕.