当前位置: 首页 > article >正文

计算机网络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.kler.cn/a/406679.html

相关文章:

  • JVM中TLAB(线程本地分配缓存区)是什么
  • 2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)
  • 【从零开始的LeetCode-算法】3232. 判断是否可以赢得数字游戏
  • 基于ToLua的C#和Lua内存共享方案保姆级教程
  • 数据结构-7.Java. 对象的比较
  • 机器学习阶段学习Day31
  • 详解Java之Spring MVC篇二
  • SQL99版外连接
  • 【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
  • VSCode快速生成vue组件模版
  • BEV:显示相机视角转换-----FastBEV/IPM与LSS
  • Unity Inspector窗口可编辑的脚本变量
  • day06(单片机高级)PCB设计
  • 解锁业务成功:大数据和 AI 如何协作以释放战略洞察
  • mac安装Pytest、Allure、brew
  • 【图像去噪】论文精读:Pre-Trained Image Processing Transformer(IPT)
  • Spark RDD Checkpoint 常用于需要高容错性或深度依赖链优化的场景,特别是在机器学习和大数据处理过程中。
  • Linux 使用gdb调试core文件
  • vpc云网络如何构建(理论篇)
  • 【数据分享】中国住户调查年鉴(2000-2024) PDF
  • 【Unity3D插件】Unity3D HDRP Outline高亮发光轮廓描边插件教程
  • Flutter:SlideTransition位移动画,Interval动画延迟
  • 基于SpringBoot实现的在线课程管理系统(代码+论文)
  • 科技部的国家一级资质科技查新机构有哪些?
  • 第 28 章 - Go语言 Web 开发入门
  • android 使用MediaPlayer实现音乐播放--基础介绍