《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

相关文章

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. 恢

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程