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地址 — 通信产业...相关推荐

  1. Python网络编程基础之ip地址,端口号,TCP,socket

    Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...

  2. C# 网络编程之通过ip地址获取地理位置(补充)

    前面我写过一篇文章"C# 网络编程之获取本机名.ip地址.域名.物理位置"里面可以根据输入的网址根据其ip地址获取器物理位置,其中该部分主要代码是通过有道网提供的在线第三方接口实现 ...

  3. 挑战360无死角讲解Linux内核 进程管理,调度器的5种实现丨C++后端开发丨C/C++Linux服务器开发丨内核开发丨网络编程

    挑战360无死角讲解 进程管理,调度器的5种实现 1. 8500行 CFS是什么 2. RT调度器使用场景 3. IDLE/Dealine调度器 视频讲解如下,点击观看: 挑战360无死角讲解Linu ...

  4. linux网络编程中端口号和ip地址转换方法

    0.字节序 网络字节序:是大端序,即:高字节放在低地址位置 比如:0x7F000101 对于一个整型,如上,我们看到的该形式,只是在大小端主机中存储的顺序是相反的. 网络序的存储方式是  7F 00 ...

  5. 网络编程1-cs模型的TCP通信

    前话 协议:是数据传输和数据的解释的规则 数据在网络中传递需要进行封装.数据在四层模型中进入网络环境的传递过程(解封装时是逆的过程,最终露出数据)是: 数据->应用层协议->传输层协议-& ...

  6. linux查看Windows的ip命令,在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的. 在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开dos命令行,然后输 ...

  7. 一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

    网络编程三要素:ip地址.端口.协议,在网络通信协议下,不同计算机上运行的程序,可以进行数据传输 常见协议: 传输层 常见协议有TCP/UDP协议. 应用层 常见的协议有HTTP协议,FTP协议. 网 ...

  8. Linux服务器集群系统(三)——LVS集群中的IP负载均衡技术

     原文地址:http://www.linuxvirtualserver.org/zh/lvs3.html 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载 ...

  9. 在 Linux 命令行中查找 IP 地址介绍

    几年前,ifconfig 是 Linux 中最受欢迎的查询本机 IP 地址的方法.但是现如今 ifconfig 命令已经被启用了.在某些 Linux 发行版上已经不用了.那么,除此以外还有什么别的方式 ...

  10. c++中recvfrom函数_通俗易懂:快速理解网络编程中5种IO模型

    关于IO模型,就必须先谈到几个日常接触的几个与IO相关名字:同步,异步,阻塞,非阻塞. 名词解释 同步 如果事件A需要等待事件B的完成才能完成,这种串行执行机制可以说是同步的,这是一种可靠的任务序列, ...

最新文章

  1. [BZOJ1187]神奇游乐园(插头DP)
  2. Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持...
  3. 数据单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、、、
  4. SQl inner LOOP | HASH | MERGE join--指定Join的方法
  5. python自动点击脚本_[Python] 【Python3】教你写页游自动化Python脚本 3.取色,大漠识别和后台点击...
  6. python代码编程软件_编程与编程软件(python-pycharm)
  7. 内涝预测过程的噪音_第七章噪声解析
  8. kpi绩效考核流程图_KPI绩效考核法
  9. 2022年MathorCup 赛题浅评
  10. 【Excel技巧必知必会】
  11. MATLAB 和 Python 建模和仿真
  12. HEX、RGB颜色表
  13. mplayer-2.3节:视频输出设备 .
  14. 原版XP合集,非BT下载
  15. 从零开始搭建公司后台技术栈
  16. 2021年低压电工考试资料及低压电工免费试题
  17. 一个非常实用的漂浮广告代码(强烈推荐)
  18. 【踩坑】spconf.sty Latex样式模板的name包含下划线
  19. 学计算机买笔记本是i5 i7,对我们普通人买电脑来说,i7和i5、i3有多大区别,玩游戏选哪款好?!...
  20. CC1101之信道空闲评估(CCA:Clear Channel Assessment)

热门文章

  1. 周志华《机器学习》-所有公式推导集合
  2. 数字信号处理《数字滤波器的MATLAB与FPGA实现》
  3. 《ARM嵌入式Linux系统开发从入门到精通》勘误
  4. Linux chmod文件授权命令
  5. neatupload上传文件配置
  6. 快逸报表传递中文参数乱码解决
  7. 量化指标公式源码_最牛通达信量化副图指标公式源码
  8. 计算机电子书 2018 BiliDrive 备份
  9. 悬镜安全在RSAC2022上斩获Global InfoSec Awards四项大奖
  10. android声音播放mp3文件,如何在android中播放音频文件