linux进程通信 bzero函数,处理Linux网络编程中的IP地址 — 通信产业...
Linux网络服务能力非常强大,它的
TCP/IP代码是最高级的。Linux的网络实现是模仿FreeBSD的,它支持FreeBSD的带有扩展的Sockets(套接字)和TCP/IP协
议。它支持两个主机间的网络连接和Sockets通讯模型,实现了两种类型的Sockets:BSD Sockets和INET
Sockets。它为不同的通信模型和服务质量提供了两种传输协议,即不可靠的、基于消息的UDP传输协议和可靠的、基于流的传输协议TCP,并且都是在
IP网络协议上实现的。INET sockets是在以上两个协议及IP协议之上实现的。它们之间的关系见图1所示。
图1 Linux网络层
Socket在网络编程中的实现
套接字是网络通信的基本构件,它提供了不同主机间进程双向通信的端点。如同电话一样,只有当
一方拨通另一方的电话时,双方才能建立对话,套接字就好比是双方的电话。通过Sockets编程,程序可以跳过复杂的网络底层协议和结构,直接编制与平台
无关的应用程序。随着Internet的广泛应用,Sockets已逐渐成为网络编程的通用接口。
套接字存在于特定的通信域(即地址族)中,只有隶属于同一地址族的套接字才能建立对话。Linux支持AF_INET(IPv4协议)、AF_INET6(IPv6协议)和AF_LOCAL(Unix域协议)。
Linux支持以下的socket families或domain:
◆ Unix domain sockets;
◆ INET TneIntemet address family supports communications via;
◆ TCP/IP protocols;
◆ Amateur radio X.25;
◆ Novel IPX;
◆ Appletalk DDP;
◆ X.25。
套接口就是网络进程的ID。网络通信也是一种进程的通信,两个网络进程通信时首先要
确定各自所在网络节点的网络地址(IP地址)。网络地址可以确定进程所在的计算机,一台计算机上可能同时有多个网络进程。为了区别不同的进程,套接口中还
需要端口号(Port)信息。在一台计算机中,一个端口一次只能分配给一个进程。所以在一台计算机中,端口号和进程可以惟一确定整个Intemet中的一
个网络进程。可以认为,套接口=网络地址+端口号。
Linux网络数据结构
在网络实际传送的数据中,有两种字节排列顺序:重要的字节在前面,或者不重要的字节在前面。
前一种叫网络字节顺序(Network Byte
Order,NBO),有些机器在内部是按照这个顺序储存数据的。当某数据必须按照NBO顺序时,那么要调用函数(例如htons())将它从本机字节顺
序(Host Byte Order,HBO)转换过来,否则传送过去的数据将使对方机器不可读。这点对于网络数据传送来说是非常关键的。
在网络中第一个被创造的结构类型是sockaddr。这个数据结构是为许多类型的套接口储存地址信息。它的定义如下:
struct sockaddr{
unsigned short sa_family; /*这个是地址族,通常是AF-xxxx的形式*/
char sa_data[14]; /*14字节的地址信息*/
};
上面代码中,sa_famdly是“AF_INET”,表示它使用的是Internet地址族;sa_data用于为套接口储存目标地址和端口信息。
为了解决struct sockaddr,创造了一个并列的结构struct sockadd_in(“in”代表“Internet”),如下所示:
struct sockaddr_in{
short int sin_family; /*地址族信息,通常是AF-xxxx的形式*/
unsigned short int sin_port; /*端口信息*/
struct in_addr sin_addr; /*网络地址*/
unsigned char sin_zero[8]; /*补位用的0*/
}
上面这个数据结构可以轻松处理套接口地址的基本元素。需要解释的是,
sin_zero被加入到这个结构中主要是为了保证struct sockaddr的数据长度和struct
sockaddr_in的一样,这样在使用标准函数时,就可以使用统一的数据接口。需要注意的是,应该使用函数bzero()将sin_zero全部置
零。最后,sin_port和sin_addb必须是网络字节顺序(Network Byte
Order)。如果声明“inadd”是数据结构stmct
sockaddr_in的实例,那么inadd.sinadd.s_addr就储存了4个字节的IP地址(网络字节顺序)。
另一个常用到的是unsigned类型。它比上面介绍的struct
sockaddr_in或struct
sockaddr用得更普遍。对于变量类型unsigned,可以使用的两种类型是short(两个字节)和long(四个字节)。假设想将short从
本机字节顺序转换为网络字节顺序,需用“h”表示本机(host),用“to”表示进行转换,然后用“n”表示网络,用“s”表示short,那么就是h
-to-n-s或者htons()(“Host to Network Short”)。
考虑到对不同机器的可移值性,这样的转换是必需的。我们对“n”、“h”、“s”和“l”这几个字母进行组合,就可以得到Linux下的全部转换函数。
IP地址在Linux网络中的处理方法
假设使用struct sockaddr_in ina,想将IP地址“164.112.175.124”储存到其中,那么所要做的是调用函数inet_addr(),转换上面“数字 + 句点”格式的IP地址到unsigned long中。这个工作可以这样来做:
ina.sin_addr.s_addr=inet_addr(”164.112.175.124”);
inet_addr()返回的地址已经是按照网络字节顺序的,不用调用htonl
()。在发生错误的时候inet_addr()返回-1。调用后,需使用正确的错误检查,比如说当IP地址为255.255.255.255的时候,返回
的就是(unsigned)-1。因为这是个广播地址,你的程序必需能够将这类错误捕获出来。
你现在就可以转换字符串形式的IP地址为1ong了。若有一个数据结构struct in_addr,按照“数字+句点”格式打印时,你要用函数inet_ntoa()(ntoa意思是network to ascⅡ),如下所示:
printf(“%s”,inet_ntoa(ina.sin_addr));
这样就可以打印IP地址。注意:函数inet—ntoa()的参数是struct in_addr,而不是long,它返回的是一个指向字符的指针。
在inet_ntoa内储存了字符数组,因此它每次调用inet_ntoa()的时候将覆盖以前的内容。
例如:
Char a1, *a2;
......
a1=inet_ntoa(ina1.sin_addr); /*假设地址是;164.112.175.124*/
a2=inet_ntoa(ina2.sin_addr);/*假设地址是:202.112.58.200*/
printf(“address 1:%s\n”,a1);
printf(“address 2:%s\n”,a2);
上面运行结果是:
address l:202.112.58.200
address 2:202.112.58.200
如果想保存地址,那么可用strcpy()保存到自己的字符数组中。
以上介绍了Linux网络编程的基础知识和对网络IP地址处理的一些技巧。如果能够将其同Linux下众多的小工具整合在一起的话,那么所开发出来的程序的功能已经不亚于一些专业的软件了。
(责任编辑:Sunny)
linux进程通信 bzero函数,处理Linux网络编程中的IP地址 — 通信产业...相关推荐
- Python网络编程基础之ip地址,端口号,TCP,socket
Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...
- C# 网络编程之通过ip地址获取地理位置(补充)
前面我写过一篇文章"C# 网络编程之获取本机名.ip地址.域名.物理位置"里面可以根据输入的网址根据其ip地址获取器物理位置,其中该部分主要代码是通过有道网提供的在线第三方接口实现 ...
- 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程
挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...
- linux网络编程中端口号和ip地址转换方法
0.字节序 网络字节序:是大端序,即:高字节放在低地址位置 比如:0x7F000101 对于一个整型,如上,我们看到的该形式,只是在大小端主机中存储的顺序是相反的. 网络序的存储方式是 7F 00 ...
- 网络编程1-cs模型的TCP通信
前话 协议:是数据传输和数据的解释的规则 数据在网络中传递需要进行封装.数据在四层模型中进入网络环境的传递过程(解封装时是逆的过程,最终露出数据)是: 数据->应用层协议->传输层协议-& ...
- linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同
在linux和windows系统上查询IP地址的命令是不一样的. 在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开dos命令行,然后输 ...
- 一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP
网络编程三要素:ip地址.端口.协议,在网络通信协议下,不同计算机上运行的程序,可以进行数据传输 常见协议: 传输层 常见协议有TCP/UDP协议. 应用层 常见的协议有HTTP协议,FTP协议. 网 ...
- Linux服务器集群系统(三)——LVS集群中的IP负载均衡技术
原文地址:http://www.linuxvirtualserver.org/zh/lvs3.html 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载 ...
- 在 Linux 命令行中查找 IP 地址介绍
几年前,ifconfig 是 Linux 中最受欢迎的查询本机 IP 地址的方法.但是现如今 ifconfig 命令已经被启用了.在某些 Linux 发行版上已经不用了.那么,除此以外还有什么别的方式 ...
- c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型
关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...
最新文章
- [BZOJ1187]神奇游乐园(插头DP)
- Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持...
- 数据单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、、、
- SQl inner LOOP | HASH | MERGE join--指定Join的方法
- python自动点击脚本_[Python] 【Python3】教你写页游自动化Python脚本 3.取色,大漠识别和后台点击...
- python代码编程软件_编程与编程软件(python-pycharm)
- 内涝预测过程的噪音_第七章噪声解析
- kpi绩效考核流程图_KPI绩效考核法
- 2022年MathorCup 赛题浅评
- 【Excel技巧必知必会】
- MATLAB 和 Python 建模和仿真
- HEX、RGB颜色表
- mplayer-2.3节:视频输出设备 .
- 原版XP合集,非BT下载
- 从零开始搭建公司后台技术栈
- 2021年低压电工考试资料及低压电工免费试题
- 一个非常实用的漂浮广告代码(强烈推荐)
- 【踩坑】spconf.sty Latex样式模板的name包含下划线
- 学计算机买笔记本是i5 i7,对我们普通人买电脑来说,i7和i5、i3有多大区别,玩游戏选哪款好?!...
- CC1101之信道空闲评估(CCA:Clear Channel Assessment)