首页 > 其他分享 >TCP与UDP的联系与区别,网络字节序与主机字节序的转换函数实践

TCP与UDP的联系与区别,网络字节序与主机字节序的转换函数实践

时间:2022-10-06 13:11:06浏览次数:49  
标签:__ UDP 字节 主机 long TCP

 (1) TCP与UDP的联系与区别:TCP是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接,一个TCP连接必须要经过三次“对话”才能建立起来。UDP是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去,UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。因此UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高,但也正因为如此,它的可靠性不如TCP协议高。

 (2) 网络字节序与主机字节序的转换函数实践:字节序,顾名思义,指字节在内存中存储的顺序。比如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序有两种:小端字节序,数值低位存储在内存的低地址,高位存储在内存的高地址;大端字节序,数值高位存储在内存的低地址,低位存储在内存的高地址。

下面以32位位宽数值0x12345678为例,小端字节序与大端字节序具体的存储区别如下所示:

  Linux socket网络编程中,经常会使用下面四个C标准库函数进行字节序间的转换:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序
uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序
uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序
uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序

 现在如果需要对64位类型数据进行主机字节序与网络字节序的转换,没有现成系统API可用,可以通过下面两种方法进行转换:

//主机序转网络序
unsigned long long htonll(unsigned long long val)
{
if(__BYTE_ORDER == __LITTLE_ENDIAN)
{
return (((unsigned long long )htonl((int)((val << 32) >> 32))) << 32) | (unsigned int)htonl((int)(val >> 32));
}
else if (__BYTE_ORDER == __BIG_ENDIAN)
{
return val;
}
}

//网络序转主机序
unsigned long long ntohll(unsigned long long val)
{
if (__BYTE_ORDER == __LITTLE_ENDIAN)
{
return (((unsigned long long )ntohl((int)((val << 32) >> 32))) << 32) | (unsigned int)ntohl((int)(val >> 32));
}
else if (__BYTE_ORDER == __BIG_ENDIAN)
{
return val;
}
}

标签:__,UDP,字节,主机,long,TCP
From: https://www.cnblogs.com/llas666/p/16757423.html

相关文章

  • 字节流输出的使用步骤:
    字节流输出的使用步骤:创建一个FileOutPutStream对象,构造方法中传递写入数据的目的地。调用FileOutPutStream对象中的方法write,把数据写入到文件中。释放资源//......
  • TCP和UDP的区别
    前言TCP/IP中有两个具有代表性的传输层协议,分别是TCP和UDP。TCP/IP网络模型计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一......
  • MySQL注入之宽字节注入
         宽字节注入时是利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我......
  • TCP和UDP的区别
    什么是TCP:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。什么是UDP:UDP为应用程序提供了一种无需建立连接就可以发送封装的IP数据包的方法。TCP和UDP的......
  • Java IO详解(三)------字节输入输出流
    那么这篇博客我们讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)  1、字节输出流:Output......
  • python的入门TCP编程
    一、创建TCP服务器创建TCP服务器的流程:使用socket创建一个套接字使用bind绑定IP和端口使用listen让套接字变成可以被动连接使用accept等待客户端的连接使用recv/send接收......
  • TCP和UDP的联系和区别
    一、TCP、UDP的区别1、TCP(传输控制协议):1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算......
  • TCP与UDP的联系与区别
    UDP(UserDataProtocol,用户数据报协议)1、UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网......
  • C# UdpClient发送超过1500字节MTU的数据包会怎么样
    如果不设置DontFragmentudpClient.DontFragment=false;那么可以发送数据包。接收端随缘收到数据包。使用WireShark可以检测到网卡上对应的数据包。如果设置DontFragm......
  • TCP协议
    三次握手第一次握手当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为x,等待服务器确认,这时客户端的状态为SYN_SENT。第二次握手......