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

ops/2024/11/28 2:27:36/

个人主页: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.ppmy.cn/ops/137238.html

相关文章

[ 渗透测试面试篇-3 ] Getshell常见方法总结

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

RGB/INT8 输入注意事项

01 技术背景 在大多数情况下,我们都推荐用户在编译处理图像任务的模型时,将 input_type_rt 参数配置 nv12,这是考虑到视频通路传来的数据通常都是 nv12 类型,这样配置可以最大化地节约耗时,提高全流程的处理效率。 但…

三、计算机视觉_07YOLO图像分类

0、前言 在《LeNet5及手势识别案例》文章中,我们基于LeNet-5网络结构,根据【gestures】手势数据集做了模型训练和预测 YOLO作为目前CV领域的扛把子,分类、检测等任务样样精通,本文将根据之前的gestures】手势数据集,…

英文版本-带EXCEL函数的数据分析

一、问题: 二、表格内容 三、分析结果 四、具体的操作步骤: 销售工作表公式设计与数据验证 类别(Category)列公式: 在Category列(假设为D列),根据ProductCode在Catalogue工作表中查找…

unity使用笔记

Build and Run, Player settings里面的设置或需要修改的内容如下: unityhub license过期解决办法:先登录账号,然后打开项目,跳转选择get free personal license即可使用,总之,要先登录,再弄li…

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能,可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧! 首先…

IM项目-----ElasticSearch

文章目录 前言ES介绍建立索引创建索引 新增文档删除文档修改文档查询文档ES和Mysql数据如何保证一致 前言 ES介绍 在IM项目中通过引入ES,支持了用户搜索和历史消息的搜索。传统的关系型数据库主要是用于事务的复杂操作,对于这种需要模糊匹配的查询语句,…

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中&#xff0…