首页 > 系统相关 >Linux 网络编程——套接字的介绍

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

时间:2022-09-28 20:04:44浏览次数:50  
标签:AF int 编程 SOCK Linux 接字 INET define


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


套接字的特性有三个属性确定,它们是:域(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 接口也提供了对这个套接字域的访问功能。

/* * Address families. */ #define AF_UNSPEC 0 /* unspecified */ #define AF_UNIX 1 /* local to host (pipes, portals) */ #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ #define AF_IMPLINK 3 /* arpanet imp addresses */ #define AF_PUP 4 /* pup protocols: e.g. BSP */ #define AF_CHAOS 5 /* mit CHAOS protocols */ #define AF_IPX 6 /* IPX and SPX */ #define AF_NS 6 /* XEROX NS protocols */ #define AF_ISO 7 /* ISO protocols */ #define AF_OSI AF_ISO /* OSI is ISO */ #define AF_ECMA 8 /* european computer manufacturers */ #define AF_DATAKIT 9 /* datakit protocols */ #define AF_CCITT 10 /* CCITT protocols, X.25 etc */ #define AF_SNA 11 /* IBM SNA */ #define AF_DECnet 12 /* DECnet */ #define AF_DLI 13 /* Direct data link interface */ #define AF_LAT 14 /* LAT */ #define AF_HYLINK 15 /* NSC Hyperchannel */ #define AF_APPLETALK 16 /* AppleTalk */ #define AF_NETBIOS 17 /* NetBios-style addresses */ #define AF_VOICEVIEW 18 /* VoiceView */ #define AF_FIREFOX 19 /* FireFox */ #define AF_UNKNOWN1 20 /* Somebody is using this! */ #define AF_BAN 21 /* Banyan */ #define AF_MAX 22

type:套接字类型(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW等)


/* * Types */ #define SOCK_STREAM 1 /* stream socket */ #define SOCK_DGRAM 2 /* datagram socket */ #define SOCK_RAW 3 /* raw-protocol interface */ #define SOCK_RDM 4 /* reliably-delivered message */ #define SOCK_SEQPACKET 5 /* sequenced packet stream */


protocol:协议类别(0、IPPROTO_TCP、IPPROTO_UDP等),设为 0 表示使用默认协议。

返回值:

成功:套接字

失败(<0)


创建 UDP 套接字示例:

int sockfd;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
perror("socket");
exit(-1);
}



套接字地址

每个套接字(端点)都有其自己的地址格式,对于 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;
};


标签:AF,int,编程,SOCK,Linux,接字,INET,define
From: https://blog.51cto.com/u_3002289/5720757

相关文章

  • Linux 线程浅析
    进程和线程的区别与联系在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么,只是维护应用程序所需的各种资源,而线程则是真正的执行实体。为了让进......
  • Linux 网络编程—— libnet 使用指南
    概述​​通过《原始套接字实例:发送UDP数据包》的学习​​,我们组UDP数据包时常考虑字节流顺序、校验和计算等问题,有时候会比较繁琐,那么,有没有一种更简单的方法呢?答案是:借......
  • Linux 网络编程——网络字节序、地址转换
    网络字节序故事的起源“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中......
  • Linux 进程调度浅析
    概述操作系统要实现多进程,进程调度必不可少。有人说,进程调度是操作系统中最为重要的一个部分。我觉得这种说法说得太绝对了一点,就像很多人动辄就说“某某函数比某某函数效率......
  • Linux 网络编程——原始套接字实例:发送 UDP 数据包
    以太网报文格式:IP报文格式:UDP报文格式:校验和函数:/*******************************************************功能:校验和函数参数:buf:需要校验数据的首地址nword:......
  • Linux磁盘管理与文件系统
    了解磁盘盘片:硬盘有多个盘片,每盘片2面磁头:每面一个磁头扇区:盘片被分为多个扇形区域,每个扇区存放512字节的数据,硬盘的最小存储单位磁道:同一盘片不同半径的同心圆,......
  • 如何在linux下检测(自身)IP冲突
    最近遇到一个需求,或者说是一个用户现场问题。我们设备先安装,设置dhcp模式获取ip进行联网,后来又安装了其他设备,但该设备是手动设置的静态ip地址,正好与我们设备冲突......
  • Linux make编译
    安装问题linux编译流程linux开发部分一般来说著名的linux系统基本上分两大类:RedHat系列:Redhat、Centos、Fedora等Debian系列:Debian、Ubuntu等RedHat系列常见的......
  • Linux下Docker方式在线安装Jenkins容器
    一、Docker在线安装https://www.cnblogs.com/dabao150114/p/16739213.html二、portainer容器在线安装https://www.cnblogs.com/dabao150114/p/16739217.html三、安装Je......
  • Linux下Jenkins离线安装(war包)
    1、下载Jenkins.war包地址:https://mirrors.jenkins.io/war-stable/2.346.3/2、将Jenkins.war包上传到/usr/local/tomcat/webapps3、浏览器访问:http://192.168.150.128......