Linux编程基础 7.1:套接字通信流程及编程接口

1 socket通信流程

在这里插入图片描述

2 socket编程接口

Linux系统中常用的socket网络编程接口有:

  • socket()
  • bind()
  • listen()
  • accept()
  • connect()
  • send()
  • recv()
  • close()
  • 其中connect()与send()为客户端专用接口;
  • bind()、listen()、accept()及recv()为服务器端专用接口;
  • socket()与close()则由服务器与客户端共用。

2.1 socket函数

#include <sys/socket.h>int socket(int domain, int type, int protocol);

功能:创建套接字,类似于文件操作中的open函数。

参数说明

  • domain:指定通信域,选择通信时的协议族:
    – AF_INET:网络通信;
    – AF_UNIX:本地通信。
  • type:指定socket的连接类型,其常用取值为:
    – SOCK_STREAM:TCP协议;
    – SOCK_DGRAM:UDP协议;
    – SOCK_RAW:ICMP协议。
  • protocol:一般设置为0,表示使用默认协议。

返回值说明

  • 成功:返回一个文件描述符,之后应用程序可以采用socket通信中的读写函数在网络中收发数据;
  • 失败:返回-1,并设置errno。

2.2 bind函数

#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
struct sockaddr {sa_family_t sa_family;char       sa_data[14];				//进程地址
};
//sockaddr的缺陷为:sa_data把目标地址和端口信息混在一起了
//sockaddr和sockaddr_in长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。
//sockaddr和sockaddr_in是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。
#include <netinet/in.h>
struct sockaddr_in {short sin_family;/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/unsigned short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/ struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/ unsigned char sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了跟SOCKADDR结构在内存中对齐*/ 
};
typedef uint32_t in_addr_t;
struct in_addr {in_addr_t s_addr;
};

功能
使服务器端的一个socket文件与网络中的一个进程进行绑定:

  • 文件描述符可标识socket文件;
  • “主机名+端口号”可标识网络中的唯一进程;
  • bind函数实际上是将服务器端的socket文件与网络中的进程地址进程绑定。

参数说明

  • sockfd:socket文件的文件描述符,一般由socket()函数返回;
  • addr:指代服务器的通信地址,其本质为struct sockaddr结构体类型的指针;
  • addrlen:参数addr的长度,实质上addr参数可接受多种协议的结构体,而这些结构体的长度各不相同,因此需使用参数addrlen额外指定结构体长度。

例如:

struct sockaddr_in servaddr;			//结构体定义
bzero(&servaddr, sizeof(servaddr));		//结构体清零
servaddr.sin_family = AF_INET;			//设置地址类型为AF_INET
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);	//设置网络地址为INADDR_ANY
servaddr.sin_port = htons(85);			//设置端口号为85

返回值说明

  • 成功:返回0;
  • 失败:返回-1,并设置errno。

2.3 listen函数

#include <sys/socket.h>int listen(int sockfd, int backlog);

功能:listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的连接请求。

参数说明

  • sockfd:socket文件描述符;
  • backlog:相应套接字请求队列的最大连接个数,也就是服务器同时可建立的最大连接数量。

返回值说明

  • 成功:0;
  • 失败:返回-1,并设置errno。

2.4 accept函数

#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:accept函数在listen函数之后使用,其功能为阻塞等待客户端的连接请求。
当传输层使用TCP协议时,服务器与客户端在创建连接前,会先经过“三次握手”机制测试连接,“三次握手”完成后,服务器调用accept函数处理连接请求,此时若还没有客户端的请求到达,便阻塞等待调用accept函数的进程,直到接收到客户端发来的请求,且服务器中已创建的连接数未达到backlog,accept函数才会返回,并传出客户端的地址。

参数说明

  • sockfd:socket文件描述符;
  • addr:传出参数,表示客户端的地址,当addr = NULL,表示不关心客户端的地址;
  • addrlen:传入传出参数,传入是为函数调用提供参数addr的长度,传出时为客户端地址结构体的实际长度。

返回值说明

  • 成功:一个套接字,用于与本次通信的客户端进行数据交互;
  • 失败:返回-1,并设置errno。

2.5 connect函数

#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:用于客户端,该函数的功能为向服务器发起连接请求。

  • connect函数的参数与bind()函数中参数的形式一致;
  • 区别在于bind中的参数为客户端进程地址,而connect的参数为服务器端地址。

参数说明

  • sockfd:socket文件描述符;
  • addr:传入参数,表示要连接的服务器地址;
  • addrlen:传入参数,为函数调用提供参数addr的长度。

返回值说明

  • 成功:0;
  • 失败:返回-1,并设置errno。

2.6 send函数

#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:向处于连接状态的套接字中发送数据。

参数说明

  • sockfd:socket文件描述符;
  • buf:指向要发送数据的缓冲区指针;
  • len:缓冲区buf中数据的长度;
  • flags:表示调用的执行方式(阻塞/非阻塞),通常设置为0。
// 下面的两个函数等效:
write(sockfd, buf,len);
send(sockfd, buf, len, 0);

Linux系统中还提供了sendto()函数和sendsg()函数,这两个函数不但能发送数据给已连接的套接字,还可向未连接的套接字发送数据。

#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

参数说明

  • sendto函数中的前4个参数与send()函数的参数相同,之后的参数dest_addr和addrlen分别用于设置接收数据进程的地址和地址的长度;
  • sendmsg函数中的第二个参数msg为struct msghdr类型的结构体指针,该参数用于传入目标进程的地址、地址的长度等信息。

返回值说明

  • 成功:0;
  • 失败:返回-1,并设置errno。

2.7 recv函数

#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:用于从已连接的套接字中接收信息。
此外,read()函数、recvfrom()函数和recvmsg()函数也可用于接收信息。

参数说明

  • sockfd:socket文件描述符;
  • buf:指向接收数据的缓冲区指针;
  • len:缓冲区buf中数据的长度;
  • flags:表示调用的执行方式(阻塞/非阻塞),通常设置为0。

返回值说明

  • 成功:返回读到的字节数;
  • 失败:返回-1,并设置errno。

2.8 close函数

#include <unistd.h>int close(int fd);

功能:用于释放系统分配给套接字的资源。

参数说明

  • fd:socket文件描述符;

返回值说明

  • 成功:0;
  • 失败:返回-1,并设置errno。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cad2016中选择全图字体怎么操作_cad教程分享CAD中如何删除顽固图层?

Autocad教程公众号&#xff0c;专注于cad教程、cad教程视频的分享&#xff0c;欢迎关注&#xff0c;下载你所需的教程资源&#xff01;如你还未关注&#xff0c;请点击文章标题下方蓝色字体的"Autocad教程"进行关注。cad教程分享-CAD中如何删除顽固图层&#xff1f;方…

div 隐藏_div的position属性

如果你想把div放到合适的位置&#xff0c;请看看这篇文章。<!-- div的position属性--><html><style>.red{height:100px;background:red;}.green{height:100px;background:green;position:relative;left:50px;top:50px;}.black{height:100px;background:black…

乔布斯在斯坦福大学演讲稿英文_西方大文豪最爱的10个英文单词,写尽人世间细腻情感!...

从小浸染在汉语中的我们&#xff0c;常被汉字的意象美震撼到&#xff0c;一字就是一世界。汉字有种无与伦比的美丽&#xff0c;寥寥数字就能营造“只可意会不可言传”的意境&#xff0c;很多人感慨英文就是一串拉丁字母&#xff0c;无法传递细腻的情感。比如很多人说像「缘分」…

web前端开发论文写作_外语论文文献引言格式—MLA Style

我们之前讨论了外语论文文献引用格式—APA Style和Chicago Style—芝加哥论文脚注引注格式&#xff0c;今天我们来介绍在Essay写作中如何使用APA格式引用文献。MLA格式是英文论文写作最常用的一种参考文献格式。很多留学小伙伴都觉得MLA引用格式很复杂&#xff0c;今天译然小编…

pmbok第七版_PMBOK第七版要来了!都有哪些变化?你准备好了么?

PMBOK第7版#PMP##职场##项目管理##战略##价值#2020年1月15日PMBOK 第7版的征求意见稿发布&#xff0c;并于2020年1月14日结束意见征集&#xff0c;预计于今年第四季度发布。基于我的项目组合管理(PfMP)&#xff0c;项目集管理(PgMP),项目管理(PMP)的培训和研究经验&#xff0c;…

简述python的特性_Python的特性概要

1、和C比较&#xff0c;Python是解释型的语言&#xff0c; 2、a>字节码特性 b>动态语义&#xff0c;即在赋值时才确定数据类型 c>缩进&#xff0c;点击tap键缩进四个空格&#xff0c;使用编译器是记得查看&#xff01;3、注意 写Python的时候首先要记得定义编码格式&a…

python自动化办公实例展示_python自动化办公?学这些就够用了

知乎上有人提问&#xff1a;用python进行办公自动化都需要学习什么知识呢&#xff1f;这可能是很多非IT职场人士面临的困惑&#xff0c;想把python用到工作中&#xff0c;却不知如何下手&#xff1f; python在自动化办公领域越来越受欢迎&#xff0c;批量处理简直是加班族的福音…

Linux编程基础 8.3:I/O多路转接服务器

1 简介 为进一步提升服务器效率&#xff0c;人们提出了一种被称为I/O多路转接的模型。其中“多路”指代连接到服务器的多个客户端程序&#xff0c;而“转接”则是指在服务器主线与各分支之间设置一个“岗位”&#xff0c;由该岗位实现监控多路连接中数据状态的功能&#xff0c…

测井储层参数预测+人工智能方法

1 问题描述 测井储层参数预测 地层泥质含量&#xff1b;地层孔隙度&#xff08;POR&#xff09;&#xff1b;含水饱和度&#xff08;SW&#xff09;&#xff1b;渗透率&#xff08;PERM&#xff09;。 输入&#xff1a;声波时差&#xff08;AC&#xff09;、补偿中子&#x…

windows 安装openssh服务端_Git神器| SourceTree安装使用教程

SourceTree 是 Windows 和Mac OS X 下免费的Git客户端管理工具。支持创建、克隆、提交、push、pull 和合并等操作。一、sourcetree的安装1. 下载sourcetree下载链接&#xff1a;Sourcetree | Free Git GUI for Mac and Windows2. 安装sourcetree点击安装&#xff0c;第一个创建…

中国大学生计算机设计大赛--软件应用与开发类--经验总结

1 大赛介绍 中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一&#xff0c;自2008年开赛至2019年&#xff0c;一直由教育部高校与计算机相关教指委等或独立或联合主办。此赛目前是全国普通高校大学生竞赛排行榜榜单赛事之一。 我们参加了很多届大赛&#xff0c;在2…

网络与系统安全1.1 中间人攻击

1 Diffie-Hellman密钥交换过程 2 中间人攻击过程

centos 安装jdk_centos7配置jdk

一、查看centos7是否有自带jdk查看是否安装过java rpm -qa | grep java 如果是centos 一般会自带两个openjdk rpm -e --nodeps 要卸载的包 (包通过上面的指令可以获取到)] 将显示java的包全都卸载 命令&#xff1a; rpm -e --nodeps 要卸载的包二、创建/opt/app目录,用于安装JD…

隐私计算 1 隐私计算的定义与背景

1 隐私计算的定义 隐私计算&#xff1a;在保证数据提供方不泄露原始数据的前提下&#xff0c;对数据进行分析计算的一系列技术&#xff0c;保障数据在流通和融合过程中“可用不可见”。 隐私计算涉及到的学科&#xff1a; 密码学&#xff1b;统计学&#xff1b;计算机体系结…

php object 对象不存在。增加对象_PHP核心

1、单例模式单例模式三要素&#xff1a;拥有一个构造函数&#xff0c;并且为private拥有一个静态成员变量来保持类的实例拥有一个访问这个实例的静态方法<?php //Instan.php 单例类class Instan{static public $instance null;private function __construct(){var_dump(…

数据库查询求小于_SQL学习笔记(二)简单查询

本篇主要学习如何通过简单查询获取想要的数据。从零学会SQL&#xff1a;简单查询​www.zhihu.com基本的查询语句从数据库中查找数据时要使用select子句&#xff0c;select子句是sql中使用最多、最基本的子句。子句是sql语句的组成要素&#xff0c;是以某一个关键字作为开始的语…

隐私计算 2.1秘密共享--问题模型及定义

1 秘密共享问题模型 1.1 富翁和三个儿子的故事 问题&#xff1a; 富翁想在自己的三个儿子中找一个最聪明的来继承自己的遗产&#xff0c;在保护好财富的同时&#xff0c;让其他两个人也参与进来&#xff0c;使得兄弟间和睦相处&#xff0c;家庭和谐。 大儿子的方案&#xff…

如何命令行结束react程序_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...

前言 以前一直有疑问困扰着我&#xff1a;人人都在吹的Docker容器化&#xff0c;与前端有何关系&#xff1f;然而在近两年的编程生涯&#xff0c;在每一次产品迭代中&#xff0c;渐渐体会到了容器化其魅力所在。应用部署从刀耕火种&#xff0c;到DevOps崛起&#xff0c;原来不止…

什么是spark的惰性计算?有什么优势?_spark——spark中常说RDD,究竟RDD是什么?

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注今天是spark专题第二篇文章&#xff0c;我们来看spark非常重要的一个概念——RDD。在上一讲当中我们在本地安装好了spark&#xff0c;虽然我们只有local一个集群&#xff0c;但是仍然不妨碍我…

前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...

背景REST作为一种现代网络应用非常流行的软件架构风格&#xff0c;自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性&#xff0c;可扩展性&#xff0c;伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数据交换&#xff…