本文档主要讲解了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. Linux 内核硬件抽象

    我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...

  2. 2019-6-23-win10-uwp-应用放到桌面

    title author date CreateTime categories win10 uwp 应用放到桌面 lindexi 2019-06-23 11:11:30 +0800 2019-06-2 ...

  3. 聊聊最近撸Spring源码感悟

    一.前言     最近一段时间撸了Spring IOC.AOP.Transactional源码,这篇文章聊聊我写了哪些小玩意,这可能就是阅读源码以后最大收获.希望大家在里面能学习一些什么东西吧: 二. ...

  4. 个人项目之数独的生成与数独残局求解——C语言实现

    点击获取项目文件 1.对项目的分析与初步计划: 起初拿到这个项目是非常懵逼的,因为涉及到很多个人的知识盲区,诸如:C语言文件的操作.命令行参数.Code Quality Analysis工具.性能分析 ...

  5. 【一起学源码-微服务】Nexflix Eureka 源码九:服务续约源码分析

    前言 前情回顾 上一讲 我们讲解了服务发现的相关逻辑,所谓服务发现 其实就是注册表抓取,服务实例默认每隔30s去注册中心抓取一下注册表增量数据,然后合并本地注册表数据,最后有个hash对比的操作. 本 ...

  6. Spring超详细总结

    Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...

  7. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  8. $[NOIp2017]$ 逛公园 $dp$/记搜

    \(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq 10^5,k\leq ...

  9. Appium Mac系统 自动测试环境搭建

    一.python 环境准备 Mac 自带 Python 环境,一般为 2.7 版本. 1.查看当前系统默认的Python路径 which python ==> /usr/bin/python 2 ...

  10. 【原创】(十五)Linux内存管理之RMAP

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...