Linux高阶——1116—SOCKET套接字基础

1、SOCKET套接字基础

操作系统提供,用于开发网络应用的一系列API函数,我们称之为套接字函数

套接字函数适用于各个语言和平台,除了API可以不同,其他概念理论或流程逻辑都相同

1、在Linux操作系统中,sock为整型,也称int sockfd,sock描述符,后续网络通信都是用此描述符

2、int sockfd,包含网络信息,默认下包含默认地址0.0.0.0与随机端口,因此sockfd创建后可以立即使用

3、int sockfd,套接字描述符,后续用于数据传输,recv(int sock),send(sockfd),sendto(sockfd),recvfrom(sockfd)

4、struct socksddr_in网络信息结构体

2、socket函数

1、socket()——socket创建

int sockfd=socket(AF_INET|AF_INET6,SOCK_STREAM|SOCK_DGRAM,0);

第一个参数——指定使用的socket协议

第二个参数——传输层协议,TCP或UDP

返回值——成功返回整型的(大于0的)socket,失败返回-1

当刚创建时,socket包含的ip为本机任意ip,包含的端口号为随机端口号,因此刚创建出来时就可以使用

因此客户端的sockfd创建以后,无需绑定,也可以使用,因为里面含有本机任意ip和端口号

2、bind()——socket绑定

int value=bind(int sockfd,struct sockaddr* addr,socklen_t addrlen);
bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));

第一个参数——int类型的socket

第二个参数——网络信息结构体的地址

第三个参数——网络信息结构体的长度

返回值——成功返回0,不成功返回-1

sockfd里可以自定义网络信息(指定ip和port),使用bind对int sockfd中的网络信息进行设置自定义

固定信息,一般只有服务端需要,大多数服务端必须绑定,保证客户端能够找到服务端,客户端随意

大多数时间udp都需要bind,而tcp只有服务端需要绑定

3、listen()——监听网络连接状态

listen(int sockfd,int backlog=128);

第一个参数——需要监听的socket

第二个参数——监听序列

返回值——成功返回0,不成功返回-1

监听连接状态,一般只有TCP协议使用

TCPIP协议的后台有双队列,第一个队列存储的为等待三次握手的socket,第二个队列存储握手成功的socket

等待三次握手的队列不能过短:因为如果等待握手的socket的数量超过了等待握手队列的长度,则下个将要等待连接的socket会被服务器主机将RST置0(复位:让客户端重连,如果客户端不重连,连接将会丢失)

队列不能过长:浪费内存资源

定位128的队列长度可以保证过万的连接

4、accept()——执行此函数等待连接,并完成握手(服务端使用)

如果存在一个服务端,有20000个客户端连接此服务端,此时服务器软件内存在多少个socket?

答:存在20001个,存在1个socket是专门用于请求连接的,其余20000个均为连接成功后,客户端的用于传输数据的socket

用于连接的socket

int socket_sock;

用于传输的socket——计算进程sock最大值,sock最大值=连接数量+1

int client_sock;

accept是经典的阻塞连接函数

client_sock=accept(server_sock,struct sockaddr* client_addr,&addrlen);

第一个参数——服务端socket

第二个参数——客户端连接成功,成功后将客户端的网络信息结构体传出到client_addr中,获得客户端的ip和端口号

第三个参数——传入传出信息长度,传入能够接收的长度,传出结构体实际接收到多大的长度

socklen_t addrlen;
addrlen=sizeof(client_addr);

需要注意:每次连接前都要初始化addrlen,否则能够输入的大小会越来越小

返回值——指向客户端的socket——client_sock

client_sock存储指向客户端的sock,后续与客户端数据通信使用它

5、connect()——通过此函数对目标请求tcp连接(客户端使用)

connect(int sockfd,struct sockaddr* destaddr,sizeof(destaddr));

第一个参数——连接的socket(客户端只有一个socket)

第二个参数——目标信息结构体

第三个参数——目标信息结构体的长度

阻塞请求连接,成功返回0,失败返回-1

6、recv()读取指定sockfd中的数据包

ssize_t wlen=send(int sockfd,void* buf,strlen(buf),MSG_NOSIGNAL);

第一个参数——发送目标的sockfd

第二个参数——数据buf

第三个参数——数据长度size

第四个参数——选项

返回值——发送的长度

7、send()向sockfd发送数据包

ssize_t rlen=recv(int sockfd,void* buf,size(buf),MSG_DONTWAIT);

第一个参数——发送的人的sockfd

第二个参数——数据buf

第三个参数——数据长度size

第四个参数——选项flags=0—阻塞读,MSG_DONTWAIT—非阻塞读

返回值——发送的长度

3、客户端代码

#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main()
{
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = inet_addr("82.157.31.74");

    int client_sock;
    if((client_sock=socket(AF_INET,SOCK_STREAM,0))==-1)
    {   
        perror("sock create failed");
        return -1; 
    }   

    socklen_t addrlen;
    printf("TCP IO Client Running...\n");
    addrlen = sizeof(server_addr);
    if((connect(client_sock, (struct sockaddr*)&server_addr, addrlen))==-1)
    {   
        perror("failed");
        close(client_sock);
        return -1; 
    }   
    char buffer[1024];
    recv(client_sock, buffer, sizeof(buffer), 0); 
    printf("Received from server: %s\n", buffer);

    close(client_sock);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit&#xff08;小乌龟 &#xff09;的安装与使用-CSDN博客 目录 一、远程仓库 1&#xff09;在github上创建仓库 2&#xff09;在gitee上创建项目 3&#xff09;如何将远程的项目clone 到本地 4&#xff09;公司自己…

自然语言处理技术之细粒度实体识别

细粒度实体识别(Fine-Grained Named Entity Recognition, FG-NER) 1. 概述 细粒度实体识别是自然语言处理(NLP)领域中的一个重要研究方向,其目标是从文本中识别出更加具体和详细的实体类型。相比于传统的实体识别(NER),细粒度实体识别不仅关注常见的实体类别(如 人名…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

一文了解Android的核心系统服务

在 Android 系统中&#xff0c;核心系统服务&#xff08;Core System Services&#xff09;是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持&#xff0c;包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

MATLAB向量元素的引用

我们定义一个向量后&#xff0c;如果想引用的话&#xff0c;可以通过索引 i n d ind ind来实现。 注意&#xff1a;MATLAB中向量的开始索引是1&#xff0c;与许多编程语言不同。 例如&#xff1a; 如果想引用多个的话&#xff0c;可以用索引 i n d ind ind来提取多个位置 例如…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”&#xff1f;韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中&#xff0c;母亲Jang Ji-sung透过VR头显&#xff0c;看到了三年前因白血病去世的女儿Nayeon。当她伸出双手&#xff0c;居然能摸到女儿的…

paramiko 库实现的暴力破解 SSH 密码

import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量&#xff0c;可根据实际情况调整&#xff0c;适当减小可降低对目标服务器的压力以及减少多线程同步问题出…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.&#xff08;只演⽰部分常⽤的⼯作模式&#xff09; 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

QWen2.5学习

配置环境 pip install transformers 记得更新一下&#xff1a;typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

如何使用正则表达式验证域名

下面是一篇关于如何使用正则表达式验证域名的教程。 如何使用正则表达式验证域名 简介 域名是互联网上网站的地址&#xff0c;每个域名由多个标签&#xff08;label&#xff09;组成&#xff0c;标签之间用点 . 分隔。域名规则有很多细节&#xff0c;但基本要求是&#xff1a…

【MySQL】MySQL数据库入门:构建你的数据基石

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f985;数据库基础&#x1f400;什么是数据库&#x1f40f;主流数据库&#x1f986;MySQL数据库的基本…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【Mysql】Mysql函数(上)

1、概述 在Mysql中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;Mysql提供了很多函数。函数可以理解为封装好的模块代码。 2、分类 在Mysql中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类&#xff1a; &#xff08;1&#xff09;聚合函数 &#xf…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法&#xff0c;它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念&#xff1a;TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID&#xff0c;用来标识一个请求的追踪信息。一个请求…