您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

Linux网络编程基础

时间:2020-07-26 11:30:39  来源:  作者:

 

Linux网络编程基础

 

1.目标

暂时想不出什么好的应用场景,目前想到目标就是实现让两个设备通过网络传输数据,比如开发板和linux主机之间传数据,以后就可以实现开发板通过网络上报数据或者主机通过网络控制开发板

此外,暂时不想关心具体的网络模型,更注重于网络相关函数的直接使用。

Linux网络编程基础

 

2.Linux网络编程基础

2.1 嵌套字

多个TCP连接或者多个应用程序进程 可能需要同一个TCP端口传输数据。

为了区分不同应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP交互提供了称为**嵌套字(Socket)**的接口。

Linux中的网络编程正是通过Socket接口实现的,Socket是一种文件描述符。

常用的TCP/IP有以下三种类型的嵌套字:

流式嵌套字(SOCK_STREAM)

用于提供面向连接的、可靠的数据传输服务,即使用TCP进行传输。

数据报嵌套字(SOCK_DGRAM)

用于提供无连接的服务,即使用UDP进行传输。

原始嵌套字(SOCK_RAW)

可以读写内核没有处理的IP数据报,而流式嵌套字只能读取TCP的数据,数据报嵌套字只能读取UDP的数据。

因此,如果要访问其它协议发送的数据必须使用原始嵌套字,它允许对底层协议(如IP或ICMP)直接访问。

2.2 端口

TCP/IP协议中的端口,端口号的范围从0~65535。

一类是由互联网指派名字和号码公司ICANN负责分配给一些常用的应用程序固定使用的“周知的端口”,其值一般为0~1023。例如http的端口号是80,FTP为21,SSH为22,Te.NET为23等。

还有一类是用户自己定义的,通常是大于1024的整型值。

2.3 网络地址

网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信)。

在网络中,每一个节点(计算机或路由)都有一个网络地址,如192.168.1.4,也就是IP地址。

两个进程通信时,首先要确定各自所在的网络节点的网络地址。

但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。

在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。

所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程。

例如,如网络中某一台计算机的IP为192.168.1.4,操作系统分配给计算机中某一应用程序进程的端口号为1500,则此时192.168.1.4 1500就构成了一个套接口。

2.4网络地址的格式
在Socket程序设计中,struct sockaddr用于记录网络地址,其格式如下:

struct sockaddr
{
     unsigned short sa_family; /*协议族,采用AF_XXX的形式,例如AF_INET(IPv4协议族)*/
     char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/
};

但在实际编程中,并不针对sockaddr数据结构进行操作,而是用与其等价的sockaddr_in数据结构:

struct sockaddr_in
{
     short int sa_family; /*地址族*/
     unsigned short int sin_port; /*端口号*/
     struct in_addr sin_addr; /*IP地址*/
     unsigned char sin_zero[8]; /*填充0 以保持与struct sockaddr同样大小*/
};
Linux网络编程基础

 

2.4.1 网络地址的转换

IP地址通常用数字加点(如192.168.1.a)表示,而在struct in_addr中使用的式32位整数表示。因此,Linux提供如下函数进行两者之间的转换:

  • inet_aton()函数:
    所需要头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

函数格式

int inet_aton(const char *cp, struct in_addr *inp);

函数功能:将a.b.c.d字符串形式的IP地址转换成32位网络序号IP地址;*cp:存放字符串形式的IP地址的指针*inp:存放32位的网络序号IP地址

返回值:转换成功,返回非0,否则返回0;

  • inet_ntoa()函数:客户机端:
    所需要头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

函数格式

char *inet_ntoa(struct in_addr in);

函数功能:将32位网络序号IP地址转换成a.b.c.d字符串形式的IP地址;in:Internet主机地址的结构

返回值:转换成功,返回一个字符指针,否则返回NULL;

Linux网络编程基础

 

2.4 字节序

不同的CPU采用对变量的字节存储顺序可能不同。

常用的X86结构是小端模式,很多的ARM,DSP都为小端模式,即内存的低地址存储数据的低字节,高地址存储数据的高字节。

而KEIL C51则为大端模式,内存的高地址存储数据的低字节,低地址存储数据高字节。

对于网络传输来说,数据顺序必须是一致的,网络字节顺序采用大端字节序方式。

下面是四个常用的转换函数:

主机转网络:

htons()函数:

所需要头文件:

#include <netinet/in.h>

函数格式

unsigned short int htons(unsigned short int hostshort)

函数功能:将参数指定的16位主机(host)字符顺序转换成网络(net)字符顺序;hostshort:待转换的16位主机字符顺序数返回值:返回对应的网络字符顺序数;

  • htonl()函数:
    所需要头文件:
#include <netinet/in.h>

函数格式

unsigned long int htons(unsigned long int hostlong)

函数功能:将参数指定的32位主机(host)字符顺序转换成网络(net)字符顺序;hostlong:待转换的32位主机字符顺序数返回值:返回对应的网络字符顺序数;

网络转主机:

  • ntohs()函数:
    所需要头文件:
#include <netinet/in.h>

函数格式

unsigned short int ntohs(unsigned short int netshort)

函数功能:将参数指定的16位网络(net)字符顺序转换成主机(host)字符顺序;netshort:待转换的16位网络字符顺序数

返回值:返回对应的主机字符顺序数;

  • ntohl()函数:
    所需要头文件:
#include <netinet/in.h>

函数格式

unsigned long int ntohl(unsigned long int netlong)

函数功能
将参数指定的32位网络(net)字符顺序转换成主机(host)字符顺序;
netshort:待转换的32位网络字符顺序数
返回值
返回对应的主机字符顺序数;

 



Tags:Linux网络编程基础   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.目标暂时想不出什么好的应用场景,目前想到目标就是实现让两个设备通过网络传输数据,比如开发板和Linux主机之间传数据,以后就可以实现开发板通过网络上报数据或者主机通过...【详细内容】
2020-07-26  Tags: Linux网络编程基础  点击:(99)  评论:(0)  加入收藏
▌简易百科推荐
在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者及用户组别;或者在root用户下,这样可以修改任何文件的拥有者及用户组。而修...【详细内容】
2022-07-14  网站建设和维护    Tags:文件   点击:(5)  评论:(0)  加入收藏
Linux 系统日常巡检脚本,巡检内容包含了,磁盘,内存 cpu 进程 文件更改 用户登录等一系列的操作 直接用就行了。报告以邮件发送到邮箱 在log下生成巡检报告。#!/bin/bash# @Aut...【详细内容】
2022-07-14  IT运维社区    Tags:巡检脚本   点击:(1)  评论:(0)  加入收藏
引入在linux内核中,各个子系统之间有很强的相互关系,某些子系统可能对其他子系统产生的事件比较感兴趣。因此内核引入了notifier机制,当然了notifier机制只能用在内核子系统之...【详细内容】
2022-07-14  原天堂没有代码    Tags:Notifier   点击:(4)  评论:(0)  加入收藏
一 前言内存对于系统资源来说,非常重要,内存问题可以导致系统延迟增大,系统内存泄漏,进程被kill等多种严重问题,所以分析进程的内存占用很有必要。本文重点分析了程序中动态申请...【详细内容】
2022-07-12  码农世界    Tags:内存   点击:(8)  评论:(0)  加入收藏
linux 文件压缩命令 .Z 使用 compress 压缩文件 .zip 使用zip压缩文件 .gz 使用gzip压缩文件 .bz2 使用bzip2压缩文件 .xz 使用xz压缩文件 .tar 使用tar 工具打包归档,没有压...【详细内容】
2022-07-11  斩获必有所得    Tags:Linux 压缩   点击:(9)  评论:(0)  加入收藏
linux重命名文件和文件夹可以使用mv命令来实现。mv命令:Linux mv 命令用来为文件或目录改名、或将文件或目录移入其它位置。实例:比如:before.txt是修改之前的文件名,after.txt...【详细内容】
2022-07-07  网站建设和维护    Tags:linux   点击:(38)  评论:(0)  加入收藏
一、top &ndash; 实时显示系统运行状态top 命令的功能是用于实时显示系统运行状态,包含处理器、内存、服务、进程等重要资源信息。运维工程师们常常会把 top 命令比作是 “加...【详细内容】
2022-07-06  特斯汀软件测试    Tags:Linux   点击:(28)  评论:(0)  加入收藏
运行c语言文件,执行如下命令:sudo gedit test.cgcc -o test 文件名.c./test运行 .sh文件首先要开启权限,然后执行如下命令chmod 777 文件名.sh./文件名.sh...【详细内容】
2022-07-05  网站建设和维护    Tags:linux   点击:(29)  评论:(0)  加入收藏
前言学习linux少不了和vim打交道,今天我们就来了解一下什么是vim,如何高效使用vim以及如何配置vim。vi和vim都是linux下多模式的编辑器,两者关系类似于c/c++的关系,vim是vi的升...【详细内容】
2022-07-04  Java架构学习指南    Tags:vim   点击:(26)  评论:(0)  加入收藏
Crontab是linux下定时调度配置文件,通过它,我们可以让系统的程序、脚本、命令、任务按设定的时间、间隔、周期循环的运行。 在Crontab里时间粒度最小的是分钟。也就是说,通过Cr...【详细内容】
2022-07-04  网站建设和维护    Tags:Crontab   点击:(59)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条