本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数。

本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观。

Linux网络编程 Linux网络编程|人工智能物联网

1.概念

1.1套接字(socket)

Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段。

Linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符。一个完整的socket都有一个相关描述,简称五元组(协议、本地地址、本地端口、远程地址、远程端口),每一个socket有一个本地的唯一的socket,由操作系统分配。

1.2字节序

字节序分为大端字节序和小端字节序,网络协议使用网络字节序即大端字节序。

内部字节表示顺序和网络字节顺序不一样的机器,要对数据进行转换。

2字节序转换常用函数

uint32_t htonl(uint32_t hostlong);

将一个32位整数由主机字节序转换为网络字节序

uint16_t htons(uint16_t hostshort);

将一个16位整数由主机字节序转换成网络字节序

uint32_t ntohl(uint32_t netlong);

将一个32位整数由网络字节序转成主机字节序

uint16_t ntohs(uint16_t netshort);

将一个16位整数由网络字节序转换成主机字节序

3数据结构

3.1通用地址结构(一般不使用,但是内核中是使用的,所以需要强制转换为此种数据结构)

#include <sys/socket.h>

struct sockaddr{

unsigned short sa_family;

char sa_data[14];

};

sa_data:包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂糅在一起的。

sa_family:一般来说IPv4使用AF_INET。

在传递给需要地址结构的函数时,把指向该结构的指针转换成struct sockaddr *传递进去。

3.2因特网地址结构

struct in_addr{

in_addr_t s_addr //IPv4地址

};

struct scokaddr_in{

short int sin_family; //Internet地址族如AF_INET(主机字节序)

unsigned short int sin_port; //端口号,16bit(网络字节序)

struct in_addr sin_addr; //Internet地址,32bit IPv4地址(网络字节序)

unsigned char sin_zero[8]; //添0(为了格式对其的填充位)

};

通用地址结构和因特网地址结构数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便。

4.基本函数

4.1创建socket

#include <sys/socket.h>

int socket(int domain, int type, int protocal)

返回:成功返回文件描述符,出错返回-1。

socket创建在内核中,若创建成功返回内核文件描述表中的socket描述符。

参数:

domain:AF_INET IPv4因特网域、AF_INET6 IPv6因特网域、AF_UNIX unix域、AF_UNSPEC 未指定。

protocol:通常为0,表示按给定的域和套接字类型选择默认协议

type:SOCK_STREAM 流式套接字,可以提供可靠的、面向连接的的通讯流,它使用TCP协议,TCP保证了数据传输的正确性和顺序性。

SOCK_DGRAM 数据报套接字,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错,使用数据报协议UDP协议。SOCK_RAW 原始套接字,允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。SOCK_SEQPACKET 长度固定的、有序、可靠的面向连接报文传递。

4.2.IPv4地址族和字符地址间的转换函数

#include <arp/inet.h>

功能:将网络字节序转换位点分十进制

const char* inet_ntop(int domain, const void *restrict_addr, char *restrict_str, socklen_t size);

功能:将点分十进制转换为网络字节序

const char* inet_pton(int domain, const void *restrict str, char *restrict addr);

参数:

domain:Internet地址族,如AF_INET

addr:Internet地址,32位IPv4地址(网络字节序)

str:地址字符串(点分十进制)指针

size:地址字符串大小

4.3填写IPv4地址族结构案例

struct sockaddr_in sin; //定义一个sockaddr_in结构体

char buf[16];

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET; //填写Internet地址族

sin.sin_port = htons((short)3001); //填写端口号(网络字节序)

//填写sin_addr

if (inet_pton(AF_INET, "192.168.2.1", &sin.sin_addr.s_addr) <=0)

{

//错误处理

}

printf("%s\n", inet_ntop(AF_INET, &sin.sin_addr.s_addr, buf, sizeof(buf)));

Linux下socket编程基本知识的更多相关文章

  1. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  2. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  3. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  4. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  5. [转] - linux下socket编程实例

    一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...

  6. c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...

  7. linux下socket编程-进程间通信

    一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...

  8. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  9. linux 下socket编程

    原理 类unix系统中, 一切皆文件, 诸如磁盘文件, 显卡, 内核驱动, 网络协议栈等 socket就是linux中提供的用于网络通信的文件接口, 两台机器之间可以读写消息 在使用socket真正的 ...

随机推荐

  1. C# 已知点和向量,求距离的点

    已知一个点 P 和向量 v ,求在这个点P按照向量 v 运行距离 d 的点 B . 已经知道了一个点 P 和他运动方向 v ,就可以通过这个求出距离点 P 为 d 的点 B. 首先把 v 规范化,规范 ...

  2. 中文javadoc

    大量的中文注释,其实最大的目的是想生成中文的Javadoc.但是中文注释实在太不高级了,在各种编码下还会变成乱码.本着高端大气国际化的思路,还是想把它换成英文,但是又不想放弃中文的Javadoc,怎么 ...

  3. ORACLE禁用和启用外键

    禁用外键 select 'alter table '|| t.table_name||' disable constraint '||t.constraint_name||';' from user_ ...

  4. 记一次手工清除挖矿病毒WannaMine V4.0的经历

    [作者:byeyear    邮箱:byeyear@hotmail.com    转载请注明] 前两天公司信息安全处通知我的计算机存在永恒之蓝漏洞并已被病毒感染,使用多方杀软及专杀工具均无法有效清除, ...

  5. Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  6. lombok工作原理分析

    在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码.但是自动生成的代码到底是如何产生的呢? 核心之处就是对于注解的解析上.JDK5引入了注解的同时,也提供了两种解析方式. 运行时解 ...

  7. Java泛型类特性

    在2004年末Java推出了Java5,其中提供了对泛型方法和类的支持,也围绕着泛型推出了一下特性,本章将对Java泛型进行综合的概括 1.泛型特性构件pre-Java 5 1.使用Object表示泛 ...

  8. __str__、__repr__和__format__

    obj.__ str __ ()是面向用户的,该方法将实例转换为一个字符 obj.__ repr __ ()面向程序员,该方法返回一个实例的代码表示形式,通常用来重新构造这个实例,repr()函数返回 ...

  9. Linux 安装 Nvidia 驱动出现的黑屏各种问题和解决方式

    之前因为想OBS支持h264-nvenc这个功能然后就编译ffmpeg,然后使用Github上面的一个编译项目),项目编译完成之后重启电脑,然后就进入不了系统的登录页面了,选择进入Linux系统之后就 ...

  10. docker练习-堆栈

    介绍 分布式应用程序层次结构的顶部:堆栈. 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起. 单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈 ...