【Linux网络编程】套接字的介绍
套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程。
套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol)。
套接字的域
域指定套接字通信中使用的网络介质。最常见的套接字域是 AF_INET,它是指 Internet 网络,许多 Linux 局域网使用的都是该网络,当然,因特网自身用的也是它。
套接字类型
流套接字(SOCK_STREAM):
流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
数据报套接字(SOCK_DGRAM):
数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
原始套接字(SOCK_RAW):
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。
套接字协议(协议类别)
只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。通常使用默认即可(也就是最后一个参数填“0”)。
创建套接字
socket 系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问该套接字。
需要头文件:#include <sys/socket.h>
int socket(int family,int type,int protocol);
功能:
创建一个用于网络通信的 socket 套接字(描述符)
参数:
family:协议族(AF_UNIX、AF_INET、AF_INET6、PF_PACKET等)
最常见的套接字域是 AF_UNIX 和 AF_INET,前者用于通过 Unix 和 Linux 文件系统实现的本地套接字,后者用于 Unix 网络套接字。AF_INET 套接字可以用于通过包括因特网在内的 TCP/IP 网络进行通信的程序。微软 Windows 系统的 winsock 接口也提供了对这个套接字域的访问功能。
/* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain sockets */ #define AF_LOCAL 1 /* POSIX name for AF_UNIX */ #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ #define AF_APPLETALK 5 /* AppleTalk DDP */ #define AF_NETROM 6 /* Amateur Radio NET/ROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_ATMPVC 8 /* ATM PVCs */ #define AF_X25 9 /* Reserved for X.25 project */ #define AF_INET6 10 /* IP version 6 */ #define AF_ROSE 11 /* Amateur Radio X.25 PLP */ #define AF_DECnet 12 /* Reserved for DECnet project */ #define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/ #define AF_SECURITY 14 /* Security callback pseudo AF */ #define AF_KEY 15 /* PF_KEY key management API */ #define AF_NETLINK 16 #define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */ #define AF_PACKET 17 /* Packet family */ #define AF_ASH 18 /* Ash */ #define AF_ECONET 19 /* Acorn Econet */ #define AF_ATMSVC 20 /* ATM SVCs */ #define AF_SNA 22 /* Linux SNA Project (nutters!) */ #define AF_IRDA 23 /* IRDA sockets */ #define AF_PPPOX 24 /* PPPoX sockets */ #define AF_WANPIPE 25 /* Wanpipe API Sockets */ #define AF_LLC 26 /* Linux LLC */ #define AF_TIPC 30 /* TIPC sockets */ #define AF_BLUETOOTH 31 /* Bluetooth sockets */ #define AF_IUCV 32 /* IUCV sockets */ #define AF_MAX 33 /* For now.. *//* Protocol families, same as address families. */ #define PF_UNSPEC AF_UNSPEC #define PF_UNIX AF_UNIX #define PF_LOCAL AF_LOCAL #define PF_INET AF_INET #define PF_AX25 AF_AX25 #define PF_IPX AF_IPX #define PF_APPLETALK AF_APPLETALK #define PF_NETROM AF_NETROM #define PF_BRIDGE AF_BRIDGE #define PF_ATMPVC AF_ATMPVC #define PF_X25 AF_X25 #define PF_INET6 AF_INET6 #define PF_ROSE AF_ROSE #define PF_DECnet AF_DECnet #define PF_NETBEUI AF_NETBEUI #define PF_SECURITY AF_SECURITY #define PF_KEY AF_KEY #define PF_NETLINK AF_NETLINK #define PF_ROUTE AF_ROUTE #define PF_PACKET AF_PACKET #define PF_ASH AF_ASH #define PF_ECONET AF_ECONET #define PF_ATMSVC AF_ATMSVC #define PF_SNA AF_SNA #define PF_IRDA AF_IRDA #define PF_PPPOX AF_PPPOX #define PF_WANPIPE AF_WANPIPE #define PF_LLC AF_LLC #define PF_TIPC AF_TIPC #define PF_BLUETOOTH AF_BLUETOOTH #define PF_IUCV AF_IUCV #define PF_MAX AF_MAX
type:套接字类型(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW等)
/* Types of sockets. */ enum __socket_type {SOCK_STREAM = 1, /* Sequenced, reliable, connection-basedbyte streams. */ #define SOCK_STREAM SOCK_STREAMSOCK_DGRAM = 2, /* Connectionless, unreliable datagramsof fixed maximum length. */ #define SOCK_DGRAM SOCK_DGRAMSOCK_RAW = 3, /* Raw protocol interface. */ #define SOCK_RAW SOCK_RAWSOCK_RDM = 4, /* Reliably-delivered messages. */ #define SOCK_RDM SOCK_RDMSOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based,datagrams of fixed maximum length. */ #define SOCK_SEQPACKET SOCK_SEQPACKETSOCK_PACKET = 10 /* Linux specific way of getting packetsat the dev level. For writing rarp andother similar things on the user level. */ #define SOCK_PACKET SOCK_PACKET };
protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP等),设为 0 表示使用默认协议。
返回值:
成功:套接字
失败(<0)
创建 UDP 套接字示例:
运行结果如下:
套接字地址
每个套接字(端点)都有其自己的地址格式,对于 AF_UNIX 套接字来说,它的地址由结构 sockaddr_un 来描述,该结构体定义在头文件 sys/un.h 中,如下:
struct sockaddr_un {sa_family_t sun_family; //套接字域char sun_path[];//名字
};
而在 AF_INET 域中,套接字地址结构由 sockaddr_in 来指定,该结构体定义在头文件 netinet/in.h 中:
struct sockaddr_in {short int sin_family;//套接字域unsigned short int sin_port;//端口struct in_addr sin_addr; //地址char sin_zero[8];
}
IP 地址结构 sin_addr 被定义如下:
struct in_addr {unsigned long int s_addr;
};
【Linux网络编程】套接字的介绍相关推荐
- Linux 网络编程——套接字的介绍
一.套接字概述 套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(dom ...
- 4、linux网络编程--套接字的介绍
一.套接字概述: 套接字是一种通信机制(通信两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定:域(domain ...
- Linux·网络编程套接字(三)
目录 简单的TCP英译汉服务器 简单回顾 更改handler方法 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 绑定失败问题 TCP协议通讯流程 通讯流程总览 三次握手的过程 数据传输的过 ...
- Linux网络编程 - 套接字与协议族
一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...
- Linux·网络编程套接字(一)
目录 预备知识 理解源IP地址和目的IP地址 理解源MAC地址和目的MAC地址 理解源端口号和目的端口号 PORT VS PID 认识TCP协议和UDP协议 网络字节序 socket编程接口 sock ...
- 【Linux从青铜到王者】第十五篇:Linux网络编程套接字两万字详解
系列文章目录 文章目录 系列文章目录 前言 一.网络数据的五元组信息 1.理解源IP地址和目的IP地址 2.理解 "端口号" 和 "进程ID" 3.理解源端口号 ...
- 网络编程套接字(四)
网络编程套接字(四) 文章目录 网络编程套接字(四) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) tcp_process ...
- 详细讲解 —— 网络编程套接字(Java EE初阶)
网络编程套接字 1 认识网络编程套接字 2 UDP 数据报套接字编程 2.1 UPD服务端 2.1 UDP客户端 2.3 结果测试 3 TCP流套接字编程 3.1 TCP服务端 3.2 TCP客户端 ...
- 【javaEE】网络编程套接字
To u&me: 努力经营当下,直至未来明朗 文章目录 前言 一.网络编程(没时间可以跳过) 一)网络编程了解 二)相关基本概念 二.Socket套接字 三.数据报套接字通信(UDP) 写一个 ...
- UNIX网络编程---套接字编程简介(三)
UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...
最新文章
- 明晚8点直播 | Transformer新型神经网络在机器翻译中的应用
- Linux内核参数调优
- jQuery源码分析系列(37) : Ajax 总结
- 转同事博客一则,随感
- POJ 2236 Wireless Network
- php报表统计曲线源代码,PHP绘制心电形状曲线统计图表[源码]_PHP教程
- Catalyst 6000 family Architecture
- linux 忘记mysql密码的解决办法
- 龙芯电脑安装debian 10 buster
- xshell 批量创建.xsh会话文件
- 【Docker系列】 Docker secrets
- 武器目标分配问题研究进展: 模型、算法与应用
- 浅谈进程地址空间与虚拟存储空间
- 使用阿里云镜像加速器
- Spring Boot 启动 出现异常The bean xxx could not be injected as a xx.xxxx because it is a JDK dynami
- 深入理解Java虚拟机(10-13)学习总结
- 什么是Spring、Spring的优点
- 关于融云在APIcloud中的集成
- Django进阶教程
- 第 1 章 计算机系统概述
热门文章
- linux+不同分区mv,mv操作深入浅出
- 实验8.2 指针与字符串 7-2 字符串排序
- html中的标签在xml中被识别为什么,在strings.xml中定义html标签
- ise的时钟ip核_ISE的IP核clocking wizard使用和例化
- python列透视_python – 在pandas数据帧中透视列和列值
- mysql端口转发_SSH做MySQL端口转发
- php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
- ajax请求, 前后端, 代码示例
- tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
- 10种CSS3实现的Loading效果