《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

相关文章

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操