Linux下socket编程基本知识
本文档主要讲解了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编程基本知识的更多相关文章
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- linux下socket编程
相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...
- [转] - linux下socket编程实例
一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...
- c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...
- linux下socket编程-进程间通信
一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
- linux 下socket编程
原理 类unix系统中, 一切皆文件, 诸如磁盘文件, 显卡, 内核驱动, 网络协议栈等 socket就是linux中提供的用于网络通信的文件接口, 两台机器之间可以读写消息 在使用socket真正的 ...
随机推荐
- Linux 内核硬件抽象
我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...
- 2019-6-23-win10-uwp-应用放到桌面
title author date CreateTime categories win10 uwp 应用放到桌面 lindexi 2019-06-23 11:11:30 +0800 2019-06-2 ...
- 聊聊最近撸Spring源码感悟
一.前言 最近一段时间撸了Spring IOC.AOP.Transactional源码,这篇文章聊聊我写了哪些小玩意,这可能就是阅读源码以后最大收获.希望大家在里面能学习一些什么东西吧: 二. ...
- 个人项目之数独的生成与数独残局求解——C语言实现
点击获取项目文件 1.对项目的分析与初步计划: 起初拿到这个项目是非常懵逼的,因为涉及到很多个人的知识盲区,诸如:C语言文件的操作.命令行参数.Code Quality Analysis工具.性能分析 ...
- 【一起学源码-微服务】Nexflix Eureka 源码九:服务续约源码分析
前言 前情回顾 上一讲 我们讲解了服务发现的相关逻辑,所谓服务发现 其实就是注册表抓取,服务实例默认每隔30s去注册中心抓取一下注册表增量数据,然后合并本地注册表数据,最后有个hash对比的操作. 本 ...
- Spring超详细总结
Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...
- 【题解】地精部落(DP)
[题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...
- $[NOIp2017]$ 逛公园 $dp$/记搜
\(Des\) 给定一个有向图,起点为\(1\),终点为\(n\),求和最短路相差不超过\(k\)的路径数量.有\(0\)边.如果有无数条,则输出\(-1\). \(n\leq 10^5,k\leq ...
- Appium Mac系统 自动测试环境搭建
一.python 环境准备 Mac 自带 Python 环境,一般为 2.7 版本. 1.查看当前系统默认的Python路径 which python ==> /usr/bin/python 2 ...
- 【原创】(十五)Linux内存管理之RMAP
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...