《UNIX网络编程》学习笔记:基本TCP套接字编程

2024-08-23 23:58

本文主要是介绍《UNIX网络编程》学习笔记:基本TCP套接字编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.socket(int family, int type, int protocol);
返回:若成功则为非负描述符,若出错则为-1
功能:创建一个未连接的套接字

family指明地址协议族,type指明套接字类型,protocol为某个协议类型常值。


对比AF_XXX和PF_XXX:AF_前缀表示地址族(address family),PF_前缀表示协议族(protocol family),历。史上曾想单个协议族可以支持多个地址族,PF_用来创建套接字,
AF_用于套接字地址结构。但实际上,这样的协议族未曾实现过,头文件中<sys/socket.h>中为给定协议定义的PF_值总是与此协议的AF_值相等。


2.connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
返回:若成功则为0,若出错则为-1
功能:TCP客服用connect函数来建立与TCP服务器的连接。
指针和指针所指向内容的大小都传递给内核,于是内核知道到需从进程赋值多少数据进来。
返回错误的三种情况:
(1)若TCP客户没有收到SYN分节的响应,返回ETIMEDOUT错误;
(2)对客户的响应是RST,则表明该服务器主机在我们指定的端口没有进程在等待与之连接,返回ECONNREFUSED错误;
产生RST的三个情况:如前所述;TCP想取消一个已有的连接;TCP收到一个根本不存在的连接上的分节。
(3)若客户发出的SYN在中间的某个路由器上引发了一个"destination unreachable"ICMP错误,返回EHOSTUNREACH或ENETUNREACH错误给进程。
注意:每次connect失败后,都必须close当前的套接字描述符并重新调用socket。


3.bind(int sockfd, const struct *myaddr, socklen_t addrlen);
返回:若成功则为0,若出错则为-1
功能:bind函数把一个本地协议地址赋予一个套接字,调用bind可以指定IP地址或者端口,可以两者都指定,也可以都不指定。
(1)端口号:服务器在启动的时捆绑它们的端口,如果一个客户端或服务器未曾调用bind捆绑一个端口,当调用connect或listen时内核就要为套接字选择一个临时端口,
然而这对于TCP服务器来说极为罕见,且bind不返回所选择的值,必须调用getsockname来返回协议地址。
(2)地址:进程可以把一个特定的IP地址捆绑到它的套接字上,不过这个IP地址必须属于其所在主机的网络接口之一;若TCP客户不捆绑IP地址到套接字上,内核将根据外出网络接口
选择源IP地址;若TCP服务器没有捆绑地址到套接字上,内核就把客户发送的SYN的目的地址作为服务器的源IP地址。


4.listen(int sockfd, int backlog);
返回:若成功则为0,若出错则为-1
功能:listen函数仅由TCP服务器调用,主要完成两件事:
(1)当socket函数创建一个套接字时默认为主动套接字,即一个客户将调用connect发起连接的客户套接字,listen函数把这个未连接的套接字转换成一个被动套接字,指示内核
应接受指向该套接字的连接请求;
(2)规定了内核应该为这个套接字排队的最大连接个数。
内核为任何一个监听套接字维护两个队列:未完成连接队列(incomplete connection queue)和已完成连接队列(completed connection queue),listen函数的backlog参数曾经
被规定为这两个队列总和的最大值。
(1)未完成连接队列:队中每一项对应一个由客户端发出并到达服务器的SYN分节,而服务器正在等待完成相应的TCP三路握手过程。
(2)已完成连接队列:队中每一项对应一个已完成TCP三路握过程的客户,当调用accept时,已完成连接队列的对头项将返回给进程。


5.accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回:若成功则为非负描述符,若出错则为-1
功能:服务器用于从已完成连接队列队头返回下一个已完成连接,如果已完成队列为空,那么进程被投入睡眠(假定套接字为默认的阻塞方式)。
参数cliaddr和addrlen用于返回已连接的对端进程(客户)的协议地址,addrlen是一个值-结果参数(Value-Result Argument)。


6.close(int sockfd);
返回:若成功则为0,若出错则为-1
功能:把该套接字标记成已关闭,然后立即返回到调用进程。





这篇关于《UNIX网络编程》学习笔记:基本TCP套接字编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100862

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢