代码仅供参考
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#define u_int unsigned int
#define u_long unsigned long
#define SAME_NET_ORDER 1 /*主机与网络同序*/
#define DIFF_NET_ORDER 0 /*主机与网络异序*/
//判断两者是否一样长,以及网络字节序与主机字节序是否一致,不一致进行转换
//主机转网络
static u_int htoni(u_int netint)
{
u_int orderFlag,rtnInt;
u_long templong;
if(sizeof(u_long) == sizeof(u_int))/*两者一样长*/
{
rtnInt = (u_int)htonl(netint);
}
else
{
/*检查主机与网络是否异序,用htonl转换在比较是否有变化 */
templong = 1UL;
if(templong == htonl(templong))
{
orderFlag = SAME_NET_ORDER;
}
else
orderFlag = DIFF_NET_ORDER;
if(orderFlag == SAME_NET_ORDER)
rtnInt =netint;
else/*异序,htonl进行转化后移位取高位*/
{
templong = (u_long)netint;
templong = htonl(templong);
rtnInt = (u_int)(templong >> ((sizeof(u_long)-sizeof(u_int))*8));
}
}
return rtnInt;
}
//网络转主机
static u_int ntohi(u_int netint)
{
u_int orderFlag,rtnInt;
u_long templong;
if(sizeof(u_long) == sizeof(u_int))/*两者一样长*/
{
rtnInt = (u_int)ntohl(netint);
}
else
{
/*检查主机与网络是否异序,用ntohl转换在比较是否有变化 */
templong = 1UL;
if(templong == ntohl(templong))
{
orderFlag = SAME_NET_ORDER;
}
else
orderFlag = DIFF_NET_ORDER;
if(orderFlag == SAME_NET_ORDER)
rtnInt =netint;
else/*异序,htonl进行转化后移位取高位*/
{
templong = (u_long)netint;
templong = ntohl(templong);
rtnInt = (u_int)(templong >> ((sizeof(u_long)-sizeof(u_int))*8));
}
}
return rtnInt;
}