htonl/htons与inet_addr的区别

shaowenhua86 2009-11-12 09:25:40
htonl/htons与inet_addr的区别,在设地址时例如:local.sin_addr.s_addr = htonl(ServerIP);/server.sin_addr.S_un.S_addr = inet_addr(ServerIP);
有什么区别?
...全文
1119 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
today513 2011-04-20
  • 打赏
  • 举报
回复
也就是说
inet_addr("255.255.255.255")

htonl(0xffffffff)
是等价的
wchnjstar 2009-11-13
  • 打赏
  • 举报
回复
都可以啊,但inet_addr的参数是字符串,返回值是网络字节序,htonl的参数是32bit的ip,并且是主机字节序
Conry 2009-11-12
  • 打赏
  • 举报
回复
inet_addr(ServerIP); 是把字符串形式的ip转化为整数,转化后就是网络字节序
htonl(ServerIP);就是整数的ip转化为网络字节序

第二种一般用的比较少,
chehw 2009-11-12
  • 打赏
  • 举报
回复
在网络传输中network byte order采用big-endian序,对于0x0A0B0C0D,传输顺序就是0A 0B 0C 0D;

而host byte order与CPU架构有关,
intel x86架构CPU为little-endian, host byte order为0D 0C 0B 0A;
Motorlola/PowerPC/SPARC等CPU为big-endian.

因为无法确定相互通讯的两台PC是否拥有相同的CPU架构,因而用htonl/htons来统一网络编程中字(WORD)或双字(DWORD)的字节传输顺序,确保两端均可按正确的方式来进行处理

用C写的rip协议 这是其中的广播request程序片段: void RouteInit() { int i,optval=0,length,error; routeNum = 0; // init local socket address and ip address GetLocalIP(); // init route table items for(i = 0; i < MAX_NUM; i++) { SetRouteEntry(&routeTable[i].routeInfo,"0.0.0.0",0,0); routeTable[i].isvalid = 0; routeTable[i].timer = 0; routeTable[i].statue = 0; inet_aton("0,0,0,0",&routeTable[i].sourceIPAddr); } // init request packet SetRoutePacket(&reqPacket,REQUEST); SetRouteEntry(&reqPacket.routeEntry[0],"0.0.0.0",0,16); // init response packet SetRoutePacket(&resPacket,RESPONSE); recvSockAddr.sin_family = AF_INET; recvSockAddr.sin_port = htons(PORT); recvSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sendSockAddr.sin_family = AF_INET; sendSockAddr.sin_port = htons(PORT); // inet_aton("240.255.255.255",&sendSockAddr.sin_addr); sendSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); EntryInit(); sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { printf("cannot create a socket!\n"); exit(1); } if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(int)) != 0) { printf("cannot broadcast!\n"); close(sock); exit(1); } if(bind(sock,(struct sockaddr*)&recvSockAddr,sizeof(recvSockAddr))<0) { printf("cannot bind to port\n"); close(sock); exit(1); } length=sizeof recvSockAddr; getsockname(sock,(struct sockaddr*)&recvSockAddr,&length); printf("Port %d is opened. Listen for packet...\n",ntohs(recvSockAddr.sin_port)); FD_ZERO(&fdSet); FD_SET(sock,&fdSet); error = sendto(sock,&reqPacket,4+sizeof(struct ROUTE_ENTRY),0,(struct sockaddr*)(&sendSockAddr),sizeof(struct sockaddr)); if(error<0) { PrintEntry(&reqPacket.routeEntry[0]); printf("broadcast request packet failed! %d,%d,%d\n",error,sock,fdSet); } }

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧