`
lizaochengwen
  • 浏览: 644635 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

htons()

阅读更多
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。

网络字节顺序与本地字节顺序之间的转换函数:

      htonl()--"Host to Network Long"
      ntohl()--"Network to Host Long"
      htons()--"Host to Network Short"
      ntohs()--"Network to Host Short"
之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO

网络字节顺序NBO(Network Byte Order):
      按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序(HBO,Host Byte Order):
      不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
如 Intelx86结构下,short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12如IBM power PC结构下,short型数0x1234表示为12 34, int型数0x12345678表示为12   34 56 78
  
    由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同powerpc那样的顺序 。在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换。  



  2.

   转自他人博客!

在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。

   在Intel机器下,执行以下程序

int main()
{
   printf("%d \n",htons(16));
      return 0;
}
得到的结果是4096,初一看感觉很怪。

    解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。

   另外用注意,数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换。这是因为对于主机来说,大小尾端的最小单位为字节(byte)。

包含的头文件为:"winsock2.h"


原文:http://www.cnblogs.com/CBDoctor/archive/2012/10/28/2743109.html
分享到:
评论

相关推荐

    网络编程函数(练习与实例)

    server_addr.sin_port=htons(portnumber); /* 捆绑sockfd 描述符 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))== -1) { /******* 客户端程序 client.c ************/ #include ; ...

    vc.zip_4 3 2 1_earlierm8a_vc编写htons函数

    编写函数fun,功能是:根据以下攻势计算s,计算结果作为函数值返回;n通过形参传入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)

    ntohs, ntohl, htons,htonl的比较和详解.pdf

    。。。

    可以仿造ip

    我们知道,TCP/IP网络数据全部是通过封装在IP数据包中在Internet网上传送的,也就是封装建立起一个包含IP头和数据的IP数据报。一般来说,网络软件总是以多个32位字产生IP头,即使必须用附加的0填充IP头。...

    Windows环境的网络编程

    较为详细的介绍Windows下socket编程,各种机制原理和函数介绍,是郑大的教学课件

    linux下单对单网络通信

    里边改成0 sin port htons 8888 里边的8888改成0就可以了 我也是传上去了 不想改了 所以 请大家自力更生吧 ">一个简单的网络通信 使用线程控制输入输出 不过这个没有设置成为本机ip 你可以吧srtuct sockaddr in sock...

    易语言Websocket客户端模块,支持deflate,支持自定义编码消息.rar

    t = htons (size) send_data = send_data + { 254 } + 指针到字节集 (取变量数据地址 (t), 2) .默认 size = _htonll (size) send_data = send_data + { 255 } + 指针到字节集 (取变量数据地址 (size), 8)

    C++网络数据发送与接收

    clientService.sin_port = htons( 8000 ); if ( connect( client, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return; }

    利用socket实现通信

    #include <winsock.h> #include <stdio.h> #pragma comment (lib, "ws2_32.lib ") BOOL InitWinsock();...local.sin_port=htons(1000); ///监听端口 local.sin_addr.s_addr=INADDR_ANY; ///本机

    socket_linux_client.c

    #include<stdio.h> //fopen();fwrite(); #include <stdlib.h> //标准函数库 #include <errno.h> //定义...#include <netinet/in.h>//htons(); #include <sys/socket.h>//send();recv(); #include #include <dirent.h>

    从本机的3000端口接收日志

    addrSendMinitor.sin_port = htons(3000); // local port memset( &(addrSendMinitor.sin_zero),0,8); char * pInfo = (char *)sendcontentbuf; int ret=sendto(nsockSend, pInfo, (int)strlen(pInfo)+1,0, ...

    C语言TCP传输

    sadr.sin_port=htons(9999); inet_aton("192.168.180.92",&sadr;.sin_addr); r=bind(serverfd, (struct sockaddr*)&sadr;,sizeof(sadr)); if(r==-1) printf("2:%m\n"),exit(-1); printf("服务器地址绑定成功!\...

    linux 发送原始数据包

    if(-1 == (socket_msg->sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))){ //创建套接字 SOCK_RAW为原始套接字 return -2; } socket_msg->addr.sll_ifindex = inject_pkt_interface_index(socket_msg->...

    UDP.rar_IPPROTO_UDP_UDP监听_WSAStartup_sock_DGRAM

    ReceiverAddr.sin_port=htons(9000) //设置端口号 ReceiverAddr.sin_addr.s_addr=htonl(INADDR_ANY) //地址 5、绑定端口 6、接收数据: ReceivingSocket,//接收端Socket ReceiveBuf,//接收端用来存储数据的...

    Socket开发资料

    uint16_t htons(uint16_t 位的主机字节序>) uint32_t htonsl(uint32_t 位的主机字节序>) //转换为网络字节序 uint16_t ntohs(uint16_t 位的网络字节序>) uint32_t ntohl(uint32_t 位的网络字节序>) //转换为主机字节...

    socket编写windows和linux通讯程序-源码

    server.sin_addr.s_addr=htons(INADDR_ANY); if(bind(s,(struct sockaddr *)&server,sizeof(server))) { perror("bind() failed:"); exit(2); } if(listen(s,4)!=0) { perror(...

    linux下socket编程简单echo实例(c)

    参考我看到的那篇文章(要谢谢作者,写的还是很通俗易懂...serv_addr.sin_port = htons(LISTEN_PORT); 编译: gcc -o echo echo.c 后运行: ./echo & 可以这样测试: telnet localhost 5000 然后输入点东西试试吧:)

    c编写的RIP协议源程序

    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",&...

    发送TCP数据包源代码

    /定义IP首部结构体 typedef struct _iphdr ... ipHeader.total_len=htons((unsigned short)(sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data))); ipHeader.ident=0; //16位标识 ……………………

    网络文件传输程序

    server_addr.sin_port = htons(8000); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero), 8); struct_len = sizeof(struct sockaddr_in); fd = socket(AF_INET, SOCK_STREAM, 0); ...

Global site tag (gtag.js) - Google Analytics