Linux--socket编程

socket套接字编程

一、服务器和客户端的开发步骤:
在这里插入图片描述

1、创建套接字
2、为套接字添加信息(ip地址和端口号)
3、监听网络连接
4、监听到有客户端接入,接受连接(如没有接入,会发生阻塞到)
5、数据交互(服务器与客户端)
6、关闭套接字,断开连接

二、socket函数api
1、创建套接字:

int socket(int domain, int type, int protocol);/*
domain:
指明所使用的协议族,通常为AF_INET,表示互联网协议族(tcp/ip协议族);
AF_INET        IPv4因特网域(192.168.---.---)
AF_INET6       IPv6因特网域
AF_UNIX        Unix域
AF_ROUTE       路由套接字
AF_KEY         密钥套接字
AF_UNSPEC      未指定type参数指定socket的类型:SOCK_STREAM:流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。SOCK_DGRAM(报文):数据报套接字定义了一种无连接的服务器,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠的、无差错的。它使用数据协议UDP。SOCK_RAW:允许程序使用低层协议,原始套接字允许对底层协议如IP或ICMP进行访问,功能强大但较为不便,主要用于一些协议的开发。protocol:
通常赋值"0"。0选择type类型对应的默认协议IPPROTO_TCP         TCP传输协议IPPROTO_UDP         UDP传输协议IPPROTO_SCTP        SCTP传输协议IPPROTO_TIPC        TIPC传输协议
*/

2、地址
添加地址(IP地址+端口号),调用 bind() 函数
bind() 函数 :IP端口号与相应描述字赋值函数
功能:用于绑定ip地址和端口号到socketfd
参数:

sockfd:时socket的描述符
addr:是一个指向含有本机ip地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。
addrlen:长度

#include <sys/types.h>
#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//描述符,指针,指针长度//ipv4对应的是;
struct sockaddr{unisgned short as_family;//协议族char           sa_data[14];//IP+端口号
};
//同等替换
struct sockaddr_in{sa_family_t    sin_family;//协议族in_port_t      sin_port;  //端口号struct in_addr sin_addr;  //ip地址结构体unsigned char  sin_zero[8];//填充,没有实际意义,只是为跟sockaddr结构在内存中对齐,这样才能相互转换
};

3、地址转换api

int inet_aton(const char* straddr, struct in_addr addrp);
把字符串形式"192.168.1.123"转为网络能识别的格式
char
inet_ntoa(struct in_addr inaddr);
把网络格式的ip地址转为字符串形式

4、监听
调用 listen() 函数:监听设置函数
功能:
设置能处理的最大连接数, listen()并未开始接受连线,只是设置socket 的 listen 模式,listen()函数只用于服务器端,服务器进程不知道与谁连接,因此不会主动要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并做出处理:一个服务进程可以同时处理多个客户进程的连接。
主要有2个功能:
①将一个未连接的套接字转换为一个被动套接字(监听)
②规定内核为相应套接字排队的最大连接数。

内核为任何一个给定监听套接字维护两个队列:

①未完成连接队列,每个这样的SYN报文段对应其中一项:已由某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程。这些套接字处于SYN_REVD状态。
②已完成连接队列,每个已完成TCP三次握手过程的客户端对应其中一项。这些套接字处于ESTABLISHED状态。

参数:

sockfd:是socket系统调用返回服务器端的socket描述符
backlog:指定在请求队列中允许的最大请求数


#include <sys/types.h>
#include <sys/socket.h>int listen(int sockfd, int backlog);
//描述符,数量

5、连接
调用accept() 函数:
功能:
accept函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
参数:

sockfd:是socket系统调用返回的服务器端socket描述符。
addr:用来返回已连接的对端(客户端)的协议地址
addrlen:客户端地址长度

返回值:
该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建一个已连接套接字(表示TCP三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。


#include <sys/types.h>
#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//描述符,客户端地址,地址长度

6、数据收发
在套接字通信中进行字节读取函数:read(),write()。与I/O中的读取函数略有区别,他们输入和输出字节数比可能比请求的少。

ssize_t write(int fd, const void *buf,size_t nbytes);
ssize_t read(int fd, void *buf, size_t nbyte);
//函数均返回读或写的字节个数,出错则返回-1

第一个将buf中的nbyte个字节写入fd中,成功返回写入的字节个数
第二个从fd中读取nbyte个字节到buf中,返回实际读取的字节数。

网络I/O还有一些函数,例如:recv() / send(),readv() / writev(),recvmsg() / sendmsg(), recvfrom() / sendto()等

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

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

相关文章

导出视频里的字幕

导出视频里的字幕 如何利用剪映快速提取并导出视频里的字幕 https://jingyan.baidu.com/article/c35dbcb0881b6fc817fcbcd2.html 如何快速提取视频中的字幕&#xff1f;给大家介绍一种简单高效又免费的提取方法。需要利用到“剪映”&#xff0c;以下是具体的操作步骤和指引&a…

第2篇 机器学习基础 —(1)机器学习方式及分类、回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进&#xff0c;而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律&#xff0c;从而使计算机能够自动进…

SpringMVC(二)@RequestMapping注解

我们先新建一个Module。 我们的依赖如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaL…

Is This The Intelligent Model(这是智能模型吗)

Is This The Intelligent Model 这是智能模型吗 Ruoqi Sun Academy of Military Science Defense Innovation Institute, Beijing, 100091, China E-mail: ruoqisun7163.com The exposed models are called artificial intelligent models[1-3]. These models rely on knowled…

LOD1.3快速构建 | 多源数据自动化作业、图元和体块模型快速编辑、智能纹理贴图...

2023年&#xff0c;自然资源部先后发布了《实景三维中国建设总体实施方案&#xff08;2023—2025年&#xff09;》、《实景三维中国建设城市三维模型快速构建技术规定&#xff08;征求意见稿&#xff09;》等文件&#xff0c;明确提出&#xff0c;2024年底完成城市三维模型&…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

Go基础之变量和常量

Go基础之变量和常量 文章目录 Go基础之变量和常量一. 标识符、关键字、内置类型和函数1.1 标识符1.2 关键字1.3 保留字1.4 内置类型1.4.1 值类型&#xff1a;1.4.2 引用类型&#xff1a;(指针类型)1.5 内置函数1.6 内置接口error 二.Go变量命名规范2.1 采用驼峰体命名2.2 简单、…

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…

pandas read_json时ValueError: Expected object or value的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

K8S网络原理

文章目录 一、Kubernetes网络模型设计原则IP-per-Pod模型 二、Kubernetes的网络实现容器到容器的通信Pod之间的通信同一个Node内Pod之间的通信不同Node上Pod之间的通信 CNI网络模型CNM模型CNI模型在Kubernetes中使用网络插件 开源的网络组件FlannelFlannel实现图Flannel特点 Op…

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句&#xff1a;EXPLAIN5.1 基本语法5.2 EXPLAIN各列作用 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;可…

typscript开发环境搭建

typescript是基于javascript的强类型标记性语言&#xff0c;使用typescript语言可开发出不同规模的、易于扩展的web页面应用&#xff0c;本文主要描述typescript的开发环境搭建。 npm install -g typescript 如上所示&#xff0c;在本地开发环境中&#xff0c;使用nodejs运行…