计算机网络socket编程(4)_TCP socket API 详解

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

计算机网络socket编程(4)_TCP socket API 详解

收录于专栏【计算机网络】
本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 
  

目录

socket():

bind():

listen():

accept():

connect: 


下面介绍程序中常用到的 socket API, 这些函数都在 sys/socket.h 中 

socket():

socket() 打开一个网络通讯端口, 如果成功的话, 就像 open() 一样返回一个文件描述符

应用程序可以像读写文件一样用 read/write 在网络上收发数据

如果 socket() 调用出错则返回-1

对于 IPv4, family 参数指定为 AF_INET

对于 TCP 协议, type 参数指定为 SOCK_STREAM, 表示面向流的传输协议

protocol 参数的介绍从略, 指定为 0 即可

bind():

服务器程序所监听的网络地址和端口通常是固定不变的, 客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,  服务器需要调用 bind 绑定一个固定的网络地址和端口号

bind() 成功返回 0, 失败返回 -1

bind() 的作用是将参数 sockfd 和 myaddr 绑定在一起, 使 sockfd 这个用于网络通讯的文件描述符监听 myaddr 所描述的地址和端口号

前面讲过, struct sockaddr * 是一个通用指针类型, myaddr 参数实际上可以接受多种协议的 sockaddr 结构体, 而它们的长度各不相同, 所有需要第三个参数 addrlen 指定结构体的长度

我们大多程序中对 myaddr 参数是这样初始化的: 

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

1. 将整个结构体清零

2. 设置地址类型为 AF_INET

3. 网络地址为 INADDR_ANY, 这个宏表示本地的任意 IP 地址, 因为服务器可能由多个网卡, 每个网卡也可能绑定多个 IP 地址, 这样设置可以在所有的 IP 地址上监听, 直到与某个客户端建立了连接时才确定下来到底用哪个 IP 地址

4. 端口号为 SERV_POST, 我们定义为 9999, 8888等

listen():

listen 声明 sockfd 处于监听状态, 并且最多允许有 backlog 个客户端处于连接等待状态, 如果接收到更多的连接请求就忽略, 这里设置不会太大 (一般是 5) 

listen() 成功返回0, 失败返回 -1

accept():

三次握手完成后, 服务器调用 accept() 接受连接

如果服务器调用 accept() 时还没有客户端的连接请求, 就阻塞等待直到有客户端连接上来

addr 是一个传出参数, accept() 返回时传出客户端的地址和端口号

如果给 addr 参数传 NULL, 表示不关心客户端的地址

addrlen 参数是一个传入参数 (value-result argument), 传入的是调用者提供的, 缓冲区 addr 的长度以避免缓冲区溢出问题, 传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)

我们的服务器程序结构是这样的: 

while(1)
{cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);n = read(connfd, buf, MAXLINE);...close(connfd);
}

connect: 

 

客户端需要调用 connect() 连接服务器

connect 和 bind 的参数形式一致, 区别在于 bind 的参数是自己的地址, 而 connect 的参数是对方的地址

connect() 成功返回 0, 出错返回 -1 

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

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

相关文章

Jmeter数据库压测之达梦数据库的配置方法

目录 1、概述 2、测试环境 3、数据库压测配置 3.1 安装jmeter 3.2 选择语言 3.3 新建测试计划 3.4 配置JDBC连接池 3.5 配置线程组 3.6 配置测试报告 3.7 执行测试 1、概述 Jmeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试。 它最…

RAG与微调:大模型落地的最佳路径选择(文末赠书)

一、大模型技术发展现状 自2022年底ChatGPT掀起AI革命以来,大语言模型(LLM)技术快速迭代发展,从GPT-4到Claude 2,从文心一言到通义千问,大模型技术以惊人的速度发展。然而,在企业实际应用场景中…

Web 入门

HTTP 一、概念 Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 二、特点 基于TCP协议:面向连接,安全。基于请求-响应模型的:一次请求对应一次响应。HTTP协议是无状态的协…

pinia是什么?pinia简介快速入门,创建pinia到vue3项目中

一,pinia就是Vuex,的替代工具,Vuex plus 如何将pinia引入到vue3项目中? 1.首先新建一个vue3项目 全填yes npm init vuelatest 2.安装好之后查阅官方文档 pinia使用文档 3.从而得知在项目中有俩种方式安装pinia 我的本地只有nod…

Java 基于SpringBoot+vue框架的老年医疗保健网站

大家好,我是Java徐师兄,今天为大家带来的是Java Java 基于SpringBootvue框架的老年医疗保健网站。该系统采用 Java 语言开发,SpringBoot 框架,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大…

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

本文目录索引 区别一:启动流程的区别区别二:高位地址处理区别三:地址映射例程说明总结例程地址之前一直都是以SPI FLASH为例进行相关知识讲解,今天我们介绍另一款常用的配置FLASH-BPI FLASH。 今天的讲解以简洁为主,主打个能用一句话不说两句话。以和SPI区别为主,实例演…

VisionPro 机器视觉案例 之 彩色保险丝个数统计

第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计 文章目录 第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计1.案例要求2.实现思路2.1 方法一 颜色分离工具CogColorSegmenterTool将每一种颜色分离出来,得到对应的单独图像,使用斑点工具CogBlo…

实时数据研发 | Flink技术栈

下周要开始接触一些实时的内容了,想来是很幸运的,这是我在新人培训上提问过技术前辈的问题:“想学习实时相关技术,但是部门没有类似的需求,应该如何提升?”当时师姐说先用心去学,然后向主管证明…

Spring cloud 一.Consul服务注册与发现(4)

1.动态刷新案例步骤 1.问题 接着上一步,我们在consul的dev配置分支修改了内容马上访问,结果无效 会发现还是原来的内容,/(ㄒoㄒ)/~~ ,没有做到及时响应和动态刷新 2.步骤 RefreshScope主启动类添加 package com.atguigu.cloud;import org.springfram…

石油化工调度台的外观如何设计更有科技感

在石油化工行业中,调度台作为生产运营的核心指挥中枢,其设计不仅关乎操作效率,更是企业形象和技术实力的体现。那么,到底如何在调度台的外观设计中融入科技感,以提升工作效率并彰显企业前沿形象,成为了一个…

【机器学习】——朴素贝叶斯模型

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

如何使用Jest测试你的React组件

在本文中,我们将了解如何使用Jest(Facebook 维护的一个测试框架)来测试我们的React组件。我们将首先了解如何在纯 JavaScript 函数上使用 Jest,然后再了解它提供的一些开箱即用的功能,这些功能专门用于使测试 React 应…

Stm32f103X HAL库 串口DMA空闲中断学习 踩坑记

捡 了一个Stm32f103X的工控板, 开发工具是 STM32cubeide ,复制了之前闲的时候建的一个485通讯的空工程,只配置了圈中的引脚,用的是usart3 ,增加了需要用的io,编程器是网上几块钱买的jlink-ob,带模拟串口的. 在学习串口通信的过程中总感觉不太顺利 ,刚开始用串口中断…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议,其设计的目的是在Web浏览器和Web服务器之间进行实时通信(实时Web) WebSocket协议的优点包括: 1. 更高效的网络利用率:与HTTP相比,WebSocket的握手只…

PDF内容提取,MinerU使用

准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…

掌握 Spring 事务管理:深入理解 @Transactional 注解

在业务方法上使用Transactional开启声明式事务时,很有可能由于使用方式有误,导致事务没有生效。 环境准备 表结构 CREATE TABLE admin (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,username varchar(255) DEFAULT NULL,password varchar(255) …

设计模式之 观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象(Subject)。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到…

【python】将word文档内容转换为excel表格

在日常工作中,我们经常需要将Word文档中的内容提取并转换为Excel表格,以便进行数据分析和处理。本文将介绍如何使用Python编写一个简单的程序,将Word文档中的内容转换为Excel表格。 一.实例 使用以下word文档作为例子: 工具界面如…

Linux|进程程序替换

目录 什么是进程替换 替换原理 exec函数 exec* 函数的共性 什么是进程替换 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程,但替换不是创建新进程,只是将对应程序的代码和数据进行替换。具体来说,这个替换过程涉…

大数运算(加减乘除和输入、输出模块)

为什么会有大数呢?因为long long通常为64位范围约为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,最多也就19位,那么超过19位的如何计算呢?这就引申出来大数了。 本博客适合思考过这道题,但是没做出来或…