socket send函数系列,彻底弄懂socket发送函数,可做参考手册

这篇具有很好参考价值的文章主要介绍了socket send函数系列,彻底弄懂socket发送函数,可做参考手册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.系统调用流程

2 发送函数系列

2.1 send函数

2.2 sendto函数

2.3 sendmsg函数

2.4 write函数

2.5 writev函数


1.系统调用流程

socket.send,Linux网络编程,linux,tcp/ip,物联网,网络,c语言

图 1

2 发送函数系列

2.1 send函数

send函数为套接字发送函数,需套接字进行connect操作才能使用。

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数:
sockfd:套接字文件描述符
buf:发送缓冲区
len:发送数据长度

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

2.2 sendto函数

sendto函数为套接字发送函数,不管套接字是否进行connect操作都能使用。

  • 未connect:

dest_addr:对端套接字地址

addrlen:套接字地址长度

  • 已connect:

dest_addr:NULL

addrlen:0

#include <sys/types.h>  
#include <sys/socket.h>

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,             
const struct sockaddr *dest_addr, socklen_t addrlen); 

参数:
sockfd:套接字文件描述符 
buf:发送缓冲区 
len:发送数据长度 
flags:标识 
dest_addr:对端套接字地址 
addrlen:对端套接字地址长度  

返回值:
成功:返回发送的字节数 
失败:返回-1,并设置errno


2.3 sendmsg函数

sendmsg函数为套接字批量发送函数,不管套接字是否进行connect操作都能使用。

#include <sys/types.h>  
#include <sys/socket.h>

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

参数:
sockfd:套接字文件描述符
msg:发送消息体
flags:标识

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

socket.send,Linux网络编程,linux,tcp/ip,物联网,网络,c语言

图 2 struct msghdr结构体解析


sendmsg发送原理:

  • void *msg_name指定对端套接字地址,socklen_t msg_namelen为套接字地址长度,如果套接字已经进行connect操作,可以不指定对端套接字地址。
  • struct iovec *msg_iov为发送单元结构体指针,指向一块连续的struct iovec区域,每一个区域为一个发送缓冲区,可以通过size_t msg_iovlen指定一次发送的缓冲区数量,从而完成批量发送操作。
  • struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度。

socket.send,Linux网络编程,linux,tcp/ip,物联网,网络,c语言

图 3

使用示例:

struct sockaddr_in peer;
memset(&peer, 0, sizeof(peer));        
peer.sin_family = AF_INET;        
peer.sin_addr.s_addr = inet_addr(IP);        
peer.sin_port = htons(PEER_PORT);

struct iovec iov[2] = {0};        
iov[0].iov_base = send_buf1;        
iov[0].iov_len = strlen(REQUEST_STR1);        
iov[1].iov_base = send_buf2;        
iov[1].iov_len = strlen(REQUEST_STR2); 

struct msghdr msg = {0};        
msg.msg_name = &peer;       
msg.msg_namelen = sizeof(peer);        
msg.msg_iov = iov;        
msg.msg_iovlen = 2;
        
sendmsg(sockfd, &msg, 0);


2.4 write函数

write函数为文件描述写操作,可用于套接字发送操作,write和send区别为send函数需要指定flags标识。

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

参数:
fd:套接字文件描述符
buf:发送缓冲区
count:发送数据长度

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno

2.5 writev函数

writev函数为文件描述写操作,writev可用于套接字批量发送操作,writev套接字进行connect操作才能使用。

#include <sys/uio.h>

ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

参数:
fd:套接字文件描述符
iov:发送单元结构体指针
iovcnt:发送单元数量

返回值:
成功:返回发送的字节数
失败:返回-1,并设置errno


writev发送原理:

  • struct iovec为发送单元,void *iov_base指向一块内存缓冲区,unsigned int iov_len为缓冲区长度
  • int iovcnt为发送单元个数
  • writev函数和sendmsg发送操作类似


使用示例:文章来源地址https://www.toymoban.com/news/detail-729887.html

struct iovec iov[2] = {0};        
iov[0].iov_base = send_buf1;        
iov[0].iov_len = strlen(REQUEST_STR1);        
iov[1].iov_base = send_buf2;        
iov[1].iov_len = strlen(REQUEST_STR2);      
writev(sockfd, iov, 2);

到了这里,关于socket send函数系列,彻底弄懂socket发送函数,可做参考手册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 彻底弄懂Promise!!!

    目录 一、什么是Promise 二、为什么使用Promise 三、Promise的基本用法 四、Promise.resolve()与Promise.reject() 五、Promise.then与Promise.catch 六、Promise.all(iterable)与Promise.race(iterable) 七、使用场景 补充 一、什么是Promise Promise是一种用于处理异步操作的JavaScript对象。它代表了一个尚未完成但

    2024年02月02日
    浏览(35)
  • 一文带你彻底弄懂ZGC

    干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西? ZGC有什么缺点? ZGC (Z Garbage Collector) 和读写屏障 : ZGC确实使用了读写屏障。读写屏障是一种在对象读取和写入操作时自动执行的额外操作,用于维护垃圾收集器的某些属性。 在ZGC中,读写屏障主要用于两个目的: 并发可重定

    2024年02月07日
    浏览(44)
  • 彻底弄懂StringBuffer与StringBuilder的区别

    一问道StringBuffer与StringBuilder的区别,张口就来StringBuffer是线程安全的,因为它相关方法都加了synchronized ,StringBuilder线程不安全。没错,确实如此,但是我们查看过源码会发现StringBuffer是从jdk1.0就开始了,StringBuilder是从jdk1.5开始的。于是我就产生这样一个疑问,既然已

    2024年02月10日
    浏览(38)
  • [javascript核心-04]彻底弄懂Promise异步编程

    本文github地址:JavaScript_Interview_Everything 大前端知识体系与面试宝典,从前端到后端,全栈工程师,成为六边形战士 1.1. 快速上手 01快手上手.js 02.若传入的是另一个promise对象,则状态由传入的promise对象决定 03.若传入了一个实现了 then 方法的对象,则执行该then方法且由此方法

    2024年02月08日
    浏览(40)
  • 彻底弄懂Java中的MultipartFile接口和File类

            不管是在项目中还是日常需求,我们总是有操作文件数据的需求,Java中操作文件不可避免就要使用File类,而Spring中为我们提供了一个操作文件的接口,通过该接口我们可以获取用户上传的文件对象并写入文件系统中。 前言 一、File类 二、MultipartFile接口 2.1 源码和

    2024年02月04日
    浏览(43)
  • 一篇文章彻底弄懂Golang私有仓库配置问题

    一般通过 go get 拉取的是公共仓库的代码(如: github.com中的代码),是不需要任务权限就能拉下来。但当我们配置的私有仓库一般都需要用户名密码来登录才能拉取代码,所以私有仓库主要是解决认证问题。 在早期版本的Go中,“go get”用于构建和安装包。现在,“go get”专门用

    2024年01月16日
    浏览(46)
  • 一篇文章带你彻底弄懂Java的==符号

    本篇文章6735字,大概阅读时间20分钟。本文中使用到的JDK版本为1.8.0_301 目录 ==符号的定义 基本类型中==符号的判断 String类型中==符号的判断         在Java中==符号的作用分为两类:         1:==符号在八种基本类型的作用是比较对应基本类型的 数值是否相等         2:

    2024年02月08日
    浏览(52)
  • 一文带你彻底弄懂js事件循环(Event Loop)

    JavaScript事件循环是JavaScript运行时环境中处理异步操作的机制。它允许JavaScript在执行同步代码的同时处理异步任务,以避免阻塞线程并提供更好的用户体验。 本文将在浏览器异步执行原理基础上带你彻底弄懂js的事件循环机制。 js是单线程的,也就是说同一时刻只能做一件事

    2024年02月08日
    浏览(48)
  • 彻底弄懂ip掩码中的网络地址、广播地址、主机地址

    IP掩码(或子网掩码)用于确定一个IP地址的网络部分和主机部分。它是一个32位的二进制数字,与IP地址做逻辑与运算,将IP地址划分为网络地址和主机地址两部分。 在理解IP地址段中的网络地址、广播地址和主机地址之前,首先需要了解IP地址的构成。IP地址由网络号和主机

    2024年02月06日
    浏览(42)
  • 【最短路算法】一篇文章彻底弄懂Dijkstra算法|多图解+代码详解

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 算法 ;该专栏专注于蓝桥杯和ACM等算法竞赛🔥 近期目标: 写好专栏的每一篇文章 Dijkstra算法适用于 最短路问题

    2023年04月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包