套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用套接字中的相关函数来完成通信过程

套接字的特性有三个属性确定,它们是:域(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网络编程】套接字的介绍相关推荐

  1. Linux 网络编程——套接字的介绍

    一.套接字概述 套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(dom ...

  2. 4、linux网络编程--套接字的介绍

    ​一.套接字概述: 套接字是一种通信机制(通信两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定:域(domain ...

  3. Linux·网络编程套接字(三)

    目录 简单的TCP英译汉服务器 简单回顾 更改handler方法 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 绑定失败问题 TCP协议通讯流程 通讯流程总览 三次握手的过程 数据传输的过 ...

  4. Linux网络编程 - 套接字与协议族

    一 理解网络编程和套接字(socket) 1.1 网络编程和套接字概要 网络编程就是编程程序使两台连网的计算机可以互相交换数据.那么,这两台计算机之间用什么传输数据呢?首先需要物理连接.如今大部分计算 ...

  5. Linux·网络编程套接字(一)

    目录 预备知识 理解源IP地址和目的IP地址 理解源MAC地址和目的MAC地址 理解源端口号和目的端口号 PORT VS PID 认识TCP协议和UDP协议 网络字节序 socket编程接口 sock ...

  6. 【Linux从青铜到王者】第十五篇:Linux网络编程套接字两万字详解

    系列文章目录 文章目录 系列文章目录 前言 一.网络数据的五元组信息 1.理解源IP地址和目的IP地址 2.理解 "端口号" 和 "进程ID" 3.理解源端口号 ...

  7. 网络编程套接字(四)

    网络编程套接字(四) 文章目录 网络编程套接字(四) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) tcp_process ...

  8. 详细讲解 —— 网络编程套接字(Java EE初阶)

    网络编程套接字 1 认识网络编程套接字 2 UDP 数据报套接字编程 2.1 UPD服务端 2.1 UDP客户端 2.3 结果测试 3 TCP流套接字编程 3.1 TCP服务端 3.2 TCP客户端 ...

  9. 【javaEE】网络编程套接字

    To u&me: 努力经营当下,直至未来明朗 文章目录 前言 一.网络编程(没时间可以跳过) 一)网络编程了解 二)相关基本概念 二.Socket套接字 三.数据报套接字通信(UDP) 写一个 ...

  10. UNIX网络编程---套接字编程简介(三)

    UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...

最新文章

  1. 明晚8点直播 | Transformer新型神经网络在机器翻译中的应用
  2. Linux内核参数调优
  3. jQuery源码分析系列(37) : Ajax 总结
  4. 转同事博客一则,随感
  5. POJ 2236 Wireless Network
  6. php报表统计曲线源代码,PHP绘制心电形状曲线统计图表[源码]_PHP教程
  7. Catalyst 6000 family Architecture
  8. linux 忘记mysql密码的解决办法
  9. 龙芯电脑安装debian 10 buster
  10. xshell 批量创建.xsh会话文件
  11. 【Docker系列】 Docker secrets
  12. 武器目标分配问题研究进展: 模型、算法与应用
  13. 浅谈进程地址空间与虚拟存储空间
  14. 使用阿里云镜像加速器
  15. Spring Boot 启动 出现异常The bean xxx could not be injected as a xx.xxxx because it is a JDK dynami
  16. 深入理解Java虚拟机(10-13)学习总结
  17. 什么是Spring、Spring的优点
  18. 关于融云在APIcloud中的集成
  19. Django进阶教程
  20. 第 1 章 计算机系统概述

热门文章

  1. linux+不同分区mv,mv操作深入浅出
  2. 实验8.2 指针与字符串 7-2 字符串排序
  3. html中的标签在xml中被识别为什么,在strings.xml中定义html标签
  4. ise的时钟ip核_ISE的IP核clocking wizard使用和例化
  5. python列透视_python – 在pandas数据帧中透视列和列值
  6. mysql端口转发_SSH做MySQL端口转发
  7. php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
  8. ajax请求, 前后端, 代码示例
  9. tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
  10. 10种CSS3实现的Loading效果