对于网络这一块的字节序,说实话,理解不够深,在网上学些了下,先整理点,以后继续完善。
一、
在网络编程时,并不是什么时候都要考虑字节序问题。那么什么时候需要考虑呢?
实际上如果是应用层的数据,即对TCP/IP来说是透明的数据,不用考虑字节序的问题。 因为发出去是什么样子,接收到就还是什么样子,接收端收到的顺序是和发送端一致的。
TCP/IP协议本身处理数据的时候都是按照网络字节序来处理的。当一个数据是应用层和TCP/IP都需要关心的时候,如网络函数的数字类型参数,需要考虑这个数据的字节序(一般而言就是IP地址和端口号)。
例如我指定了一个端口号:
unsigned short port = 0x0012 (十进制18)
把这个端口号传个TCP/IP建立一个socket连接。
sockaddr_in addr;
addr.sin_family = AF_INET; //使用互联网际协议,即IP协议
addr.sin_port = port;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
因为网络字节序是big endian,即低地址存放的是数值的高位,所以TCP/IP实际上把这个port解释为0x1200(十进制4608)。本来打算是要在端口18建立连接的,但TCP/IP协议栈却在端口4608建立了连接。故先用htons(port)把端口号转换成网络字节序,这样就可避免这种问题了。
二、
一、
在网络编程时,并不是什么时候都要考虑字节序问题。那么什么时候需要考虑呢?
实际上如果是应用层的数据,即对TCP/IP来说是透明的数据,不用考虑字节序的问题。 因为发出去是什么样子,接收到就还是什么样子,接收端收到的顺序是和发送端一致的。
TCP/IP协议本身处理数据的时候都是按照网络字节序来处理的。当一个数据是应用层和TCP/IP都需要关心的时候,如网络函数的数字类型参数,需要考虑这个数据的字节序(一般而言就是IP地址和端口号)。
例如我指定了一个端口号:
unsigned short port = 0x0012 (十进制18)
把这个端口号传个TCP/IP建立一个socket连接。
sockaddr_in addr;
addr.sin_family = AF_INET; //使用互联网际协议,即IP协议
addr.sin_port = port;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
因为网络字节序是big endian,即低地址存放的是数值的高位,所以TCP/IP实际上把这个port解释为0x1200(十进制4608)。本来打算是要在端口18建立连接的,但TCP/IP协议栈却在端口4608建立了连接。故先用htons(port)把端口号转换成网络字节序,这样就可避免这种问题了。
二、