| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 手把手写C++服务器(22):Linux socket网络编程进阶第一弹 -> 正文阅读 |
|
[网络协议]手把手写C++服务器(22):Linux socket网络编程进阶第一弹 |
目录 地址信息函数:getsockname()、getpeername() 获取服务完整信息:getserverbyname()、getserverbyport() TCP数据读写:recv()、send()TCP是流协议,recv()和send()用于读写缓冲区:
recv读取sockfd上的数据, buf和len参数分别指定读缓冲区的位置和大小, flags参数通常设置为0即可。 recv成功时返回实际读取到的数据的长度, 它可能小于我们期望的长度len。 因此我们可能要多次调用recv, 才能读取到完整的数据。 send往sockfd上写入数据, buf和len参数分别指定写缓冲区的位置和大小。 send成功时返回实际写入的数据的长度, 失败则返回-1并设置errno。 flags参数:一般设0,其他数值定义如下 MSG_OOB 传送的数据以out-of-band 送出。 MSG_DONTROUTE 取消路由表查询 MSG_DONTWAIT 设置为不可阻断运作 MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断。 UDP数据读写:recvfrom()、sendto()
recvfrom:用于读取sockfd上面的数据; sendto:往sockfd上写入数据; buf:缓冲区的位置 len:缓冲区大小 相比于tcp的两个API recv()和send(),参数多了地址src_addr和地址的长度addrlen,这是因为UDP没有连接的概念,每次读取数据都需要获取发送端的socket地址。 通用数据读写:recvmsg()、sendmsg()通用的意思是TCP和UDP都能使用
msghdr结构的定义:
地址信息函数:getsockname()、getpeername()
getsockname():获取sockfd对应的本端socket地址,并将其存储与address参数指定内存中。如果实际socket地址长度大于address指定内存中的大小,那么该socket地址将被截断 。 getpeername():获取sockfd对应的远端socket地址,用法和getsockname类似。 socket选项读取和设置文件描述符的属性和方法。
level:指定属性,如IPv4、IPv6、TCP等 具体选项参数含义:https://pubs.opengroup.org/onlinepubs/7908799/xns/getsockopt.html
常用选项选讲:1、SO_REUSEADDR 当TCP连接处于TIME_WAIT状态的时候,SO_REUSEADDR来强制使用被处于TIME_WAIT状态的连接占用的socket地址。使该地址能立即被重用。 2、SO_RCVBUF TCP接收缓冲区大小 3、SO_SNDBUF TCP发送缓冲区大小 4、SO_RCVLOWAT TCP接收缓冲区低水位标记,被I/O复用系统调用用来判断socket是否可写。 5、SO_SNDLOWAT TCP发送缓冲区低水位标记,被I/O复用系统调用用来判断socket是否可写。 6、SO_LINGER 控制close系统调用在关闭TCP连接时的行为 获取服务完整信息:getserverbyname()、getserverbyport()
getserverbyname:根据名称获取某个服务的完整信息。 getserverbyport:根据端口号获取某个服务的完整信息。 两个函数都是通过读取/etc/services文件来获取服务信息的。 参数name指定目标服务的名字;port指定端口号;proto指定服务类型,传递tcp表示获取流服务,传递udp表示获取数据报服务,传递NULL表示获取所有类型的服务。 返回servent结构体定义如下:
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 6:02:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |