java 网络字节序转主机字节序_C语言高级编程——网络编程技术
了解什么是网络编程
熟悉七层网络模型
熟悉网络开发中使用到的函数
掌握TCP协议类程序开发
掌握UDP协议类程序开发
计算机本身是不会进行网络通信的,所以要想使通过软件进行网络通信,必须制定相应的规则,其中就包括网络架构、通讯协议、等等。
什么是ip地址?什么是端口?它们有什么作用?
ip地址是每一个主机进行网络通信的唯一id,每一个主机如果要是用网络通信,必须要使用一个ip地址。
端口,一个主机中可能会有很多网络通信程序,每一个程序都要使用这个固定ip进行通信,所以端口就是每一个固定程序的id。
Ip地址加端口就可以构成一个本机网络通信的基本条件。
TCP (流格式传输控制协议)
UDP(数据包格式传输控制协议)
网络架构
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。
UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。
七层网络架构组成:
应用层(Application)
表示层(Presentation)
会话层(Session)
传输层(Transport)
网络层(Network)
数据链路层(Data Link)
物理层(Physical)
物理层是硬件。应用层是和硬件层相隔最远的--它是用户和网络交互的地方。
首先是简单的一个:socket描述符。它是下面的类型:int,仅仅是一个常见的int。
需要注意的是:有两种字节排列顺序:重要的字节在前面,或者不重要的字节在前面。前一种叫“网络字节顺序(Network Byte Order)”。有些机器在内部是按照这个顺序储存数据,而另外一些则不然。当要求某数据必须按照NBO顺序,那么就要调用函数(例如htons())来将它从本机字节顺序(Host Byte Order)转换过来。如果没有用到NBO,那么就让它保持本机字节顺序。
由于网络程序运行在不同的主机平台,所以通讯地址需要有一个统一的标准。保证程序的兼容性问题制定了网络字节序和主机字节序。
网络字节顺序NBO:按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序HBO:不同的机器HBO不相同,与CPU设计有关,不同的CPU有不同的字节序类型。这些字节序是指整数在内存中保存的顺序,这个叫做主机序。
IP地址是指互联网协议地址,是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
socket函数
bind函数
connect函数
listen函数
accept函数
WSAStartup函数与WSACleanup函数
send函数与recv函数
sendto函数与recvfrom函数
closesocket函数与shutdown函数
socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数。其原型如下:
SOCKET socket (
int af,
int type,
int protocol );
参数介绍如下:
af:一个地址描述。
type:新套接口的类型描述。
protocol:套接口所用的协议。如调用者不想指定,可用0指定,表示缺省。
在使用socket函数进行编程时,需要加入winsock2.h头文件,并且引入ws2_32.lib静态库。
bind函数将一个本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑。
函数原型:
int bind
( SOCKET s,
const struct sockaddr FAR* name,
int namelen );
参数类型:
s:已经创建好的一个套接字句柄。
name:是一个指向sockaddr结构体类型的指针。
namelen:表示sockaddr结构的长度,可以用sizeof函数获得。
本函数用于创建与指定外部端口的连接。s参数指定一个未连接的数据报或流类套接口。如套接口未被捆绑,则系统赋给本地关联一个唯一的值,且设置套接口为已捆绑。
函数原型:
int connect (
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);
参数类型:
s:标识一个未连接socket
name:指向要连接套接字的sockaddr结构体的指针
namelen:sockaddr结构体的字节长度
Listen函数让创建的套接字处于监听状态,主要用于监听连接请求。
函数原型:
int listen (
SOCKET s,
int backlog
);
参数说明:
s一个已绑定未被连接的套接字描述符
backlog连接请求队列的最大长度(一般由2到4)
accept函数主要用于服务器端,一般位于listen函数之后,默认会阻塞进程,直到有一个客户请求连接,建立好连接后,它返回的一个新的套接字socket_new,此后,服务器端即可使用这个新的套接字socket_new与该客户端进行通信,而sock则继续用于监听其他客户端的连接请求。
函数原型:
SOCKET accept (
SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen
);
参数说明:
s:套接字句柄,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
WSAStartup函数完成对Winsock服务的初始化,使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。
WSACleanup函数用于清理工作,每一次WSAStartup()调用,必须有一个WSACleanup()调用,用于实际的清理工作。此函数没有参数因为它只做清理工作
send函数适用于已连接的数据包或流式套接口发送数据。对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。
recv函数同send函数类似,只不过一个用于发送一个用于接收。
Sendto函数用来将数据由指定的socket传给对方主机,由于sendto函数是基于UDP传输协议的所以不用建立连接。
recvfrom函数用于从(已连接)套接字上接收数据,并捕获数据发送源的地址。
Closesocket函数关闭一个已经建立的套接字。更确切地说,它释放socket建立好的套接字句柄,关闭以后对对套接字的访问均以WSAENOTSOCK错误返回。
shutdown函数用于任何类型的套接口禁止接收、禁止发送或禁止收发。
基于TCP协议的网络通信程序,有一个服务端一个客户端,查看一下一个简单通讯模型。
Tcp通信基本流程:
服务器端-----------------------------------------------客户端
1.创建socket------------------------------------------1.创建socket
2.bind()
3.listen()
4.accept()
等待客户端连接---------------------------------------2.connect()
5.读数据(recv)-------------------------------------3.写数据(send)
6.写数据(send)------------------------------------4.读数据(recv)
7.关闭socket(closesocket())---------------5.关闭socket(closesocket())
基于UDP协议我们做一个聊天室程序,它分为服务端和客户端两个程序。
Udp通信基本流程:
服务器端:-------------------------------------客户端
1.创建socket----------------------------------1.创建socket
2.bind()-------------------------------------2.bind()
3.recvfrom
等待连接---------------------------------------3.sendto()
4.sendto()--------------------------------- 4.recvfrom()
5.关闭socket(closesocket())------5.关闭socket(closesocket())
java 网络字节序转主机字节序_C语言高级编程——网络编程技术相关推荐
- java转网络字节序_【转】网络字节序与主机字节序
最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序 ...
- linux网络编程一:主机字节序与网络字节序的的判断
linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...
- php 字节序,Linux_Linux中网络字节序和主机字节序,主机字节序就是我们平常说的 - phpStudy...
Linux中网络字节序和主机字节序 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序.Big-Endian和Littl ...
- C#之网络字节序与主机字节序互转
主机字节序转网络字节序 //加上两个字节长度,再发送byte[] bSend = new byte[buffer.Length + 2]; byte[] bLenth = BitConverter.G ...
- 网络字节序与主机字节序的相互转换
1.网络字节序与主机字节序 在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换.说到网络字节序与主机字节序需要清晰了解以下几个概念. 字节序,顾名思义,指字节在内存中存储的顺序.比如一个 ...
- 网络字节序和主机字节序
网络字节序说明 TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.例如上一节的UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地 ...
- 网络字节序和主机字节序互转
1.网络字节序转为主机字节序 //网络字节序转为主机字节序 uint64_t utils::Ntohll(uint64_t val) {if (__BYTE_ORDER == __LITTLE_END ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
最新文章
- Python学习第四天----Linux之用户与用户组权限
- linux 脚本发邮件短信,shell 监控脚本 短信告警
- Linux系统下用python写程序,用Python写个Linux系统命令
- Redis源码解析:07压缩列表
- CodeForces - 1066C Books Queries(思维)
- 面试官系统精讲Java源码及大厂真题 - 40 打动面试官:线程池流程编排中的运用实战
- C++新特性探究(9.1):functor仿函数探究
- div嵌套,内层的margin-top会跑到外层
- AcWing 894. 拆分-Nim游戏
- python机器学习入门实例-老司机学python篇:第一季(基础速过、机器学习入门)
- Java常量不能二次赋值与常量不能修改值意思一样吗?
- eclipse添加约束文件
- c 语言读取字符串长度,C++获取字符串长度的几个函数方式
- 微信电子驾驶证怎么查询
- android OTA更新
- 下载excel表格后缀名为.do形式
- CAD修改文字(网页版)
- 2021中传计算机考研,2021中国传媒大学考研拟录取名单已公布
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
- WordPress正确使用51la统计来统计网站访问数据[WP教程]