send, sendto, sendmsg - 从套接字发送消息
概述
#include <sys/types.h>
#include
<sys/socket.h>
int send(int s, const void *msg, size_t
len, int flags);
int sendto(int
s, const void *msg, size_t len,
int flags, const struct sockaddr *to, socklen_t
tolen);
int sendmsg(int s, const struct
msghdr *msg, int flags);
描述
Send, sendto, 和 sendmsg 用于向另一个套接字传递消息.
Send 仅仅用于连接套接字,而 sendto 和 sendmsg 可用于任何情况下.
目标地址用 to 指定, tolen 定义其长度.消息的长度用 len 指定.
如果消息太长不能通过下层协议,函数将返回 EMSGSIZE 错误,消息也不会被送出.
在数据传送过程中所产生的错误不会返回给 send. 如果发生本地错误,则返回-1.
当要发送的消息长度大于套接字当前可用缓冲区时, send 将阻塞,除非在套接字上设置了非阻塞式输入输出模式.
对于非阻塞模式,这种情况下将返回 EAGAIN 错误. The 系统调用 select(2)
可以用来检测何时可以发送更多的数据.
参数 flags 是一个标志字,可以包含下列标志:
- 对于支持带外数据的套接字,
- MSG_OOB 将送出 out-of-band (带外)数据(比如, SOCK_STREAM 类型的套接字);
下层协议也必须支持. 带外 数据. - MSG_DONTROUTE
- 在送出分组时不使用网关.只有直接连接在网络上的主机才能接收到数据.这个标志通常仅用于诊断和路由程序. 可路由的协议族才能使用这个标志;包套接字不可以.
- MSG_DONTWAIT
- 使用非阻塞式操作;如果操作需要阻塞,将返回 EAGAIN 错误(也可以用 F_SETFL
fcntl(2) 设置 O_NONBLOCK 实现这个功能.) - MSG_NOSIGNAL
- 当流式套接字的另一端中断连接时不发送 SIGPIPE 信号,但仍然返回 EPIPE 错误.
- MSG_CONFIRM (仅用于Linux 2.3以上版本)
- 通知链路层发生了转发过程:得到了另一端的成功应答. 如果链路层没有收到通知,它将按照常规探测网络上的相邻主机(比如通过免费arp). 只能用于
SOCK_DGRAM 和 SOCK_RAW 类型的套接字,且仅对IPv4和IPv6有效.详情参见 arp(7)
结构体 msghdr 的定义如下.详情参见 recv(2) 和下文.
-
-
struct msghdr {
void * msg_name; /*地址选项*/
socklen_t msg_namelen; /*地址长度*/
struct iovec * msg_iov; /*消息数组*/
size_t msg_iovlen; /*msg_iov中的元素个数*/
void * msg_control; /*辅助信息,见下文*/
socklen_t msg_controllen; /*辅助数据缓冲区长度*/
int msg_flags; /*接收消息标志*/
};
可以使用 msg_control 和 msg_controllen 成员发送任何控制信息.内核所能处理的最大控制消息缓冲区长度由 net.core.optmem_max sysctl对每个套接字进行限定;参见 socket(7).
返回值
成功时返回发送的字符个数,否则返回-1.
错误代码
其中一些是套接字层产生的标准错误.其他的是下层协议模块产生的;参见各自的man手册.
- EBADF
- 指定了非法描述符.
- ENOTSOCK
- 参数 s 不是一个套接字.
- EFAULT
- 参数指定的用户地址空间非法.
- EMSGSIZE
- 消息长度越界.
- EAGAIN或者EWOULDBLOCK
- 套接字设置为非阻塞式,但所请求的操作需要阻塞.
- ENOBUFS
- 网络接口输出队列已满.这通常表明接口已停止发送,也有可能是暂时性的拥挤(这不会发生在linux下,当设备队列溢出时数据报只是被简单丢弃.
- EINTR
- 接收到信号.
- ENOMEM
- 没有可用内存.
- EINVAL
- 传递的参数非法.
- EPIPE
- 连接套接字的本地端已关闭.这种情况下进程还会接收到 SIGPIPE 信号,除非设置了 MSG_NOSIGNAL
send, sendto, sendmsg - 从套接字发送消息的更多相关文章
- Python网络编程——修改套接字发送和接收的缓冲区大小
很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...
- 用Socket套接字发送和接收文件(中间用数组存取)
创建服务端: public class TcpFileServer { public static void main(String[] args) throws Exception { //1创建S ...
- (转载)Linux 套接字编程中的 5 个隐患
在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开 ...
- Linux 套接字编程中的 5 个隐患
http://www.ibm.com/developerworks/cn/linux/l-sockpit/ 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系 ...
- Linux 套接字编程中要注意的细节
隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获 ...
- Linux 套接字编程中的 5 个隐患(转)
本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新 ...
- 一、网络编程-UDP传输协议及socket套接字使用
知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP 2.ip:ip就是标记网络中中的一台电脑 ...
- python_socket (套接字)
socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的. 网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接 ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- apache You don't have permission to access / on this server.无权访问
环境:ubuntu16.4 apache2 原因:修改了apache web项目路径 解决: 1. 修改 /etc/apache2/sites-available/000-default.conf 文 ...
- Java数据流学习
数据流 与机器无关的操作Java基本数据类型.网络传输会用. DataInputStream 数据输入流允许应用程序以与机器无关的方式从底层输入流中读取Java基本数据类型.应用程序可以使用数据输出流 ...
- Scene Text Detection(场景文本检测)论文思路总结
任意角度的场景文本检测论文思路总结共同点:重新添加分支的创新更突出场景文本检测基于分割的检测方法 spcnet(mask_rcnn+tcm+rescore) psenet(渐进扩展) mask tex ...
- JAVA 利用 jmc或jvisualvm 监控 本地或者远程JVM
本地检测之间到$JAVA_HOME/bin 下的目录点击jmc 或者jvisualvm,然后选择你要监控的app 可是一般我们生产环境项目都是部署在远程,这个时候想要监控怎么办 1.监控tomcat ...
- Eclipse中 Run as --->Maven build 命令详解
Maven Build Goals: clean 清除编译,compile 编译,test 编译并测试,install 打包并发送到本地仓库,package 只是打成jar包,并不会发送到本地 ...
- 如何使用WidsMob Montage—蒙太奇制作有趣的动物照片?
今天,越来越多的人有宠物.根据最近的一项调查,超过六成的美国人在家中至少有一只宠物.这些宠物不是动物,而是家庭成员.因此,有趣的动物照片成为社交媒体上的热门话题是有道理的.当您打开朋友圈或短视频APP ...
- leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素
题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr ...
- boost bimap
The library Boost.Bimap is based on Boost.MultiIndex and provides a container that can be used immed ...
- umeditor word文档图片粘贴-自动上传到服务器
图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...
- [CSP-S模拟测试]:小奇挖矿2(DP+赛瓦维斯特定理)
题目背景 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. 题目描述 现在有$m+1$个星球,从左到右标号为$0$到$n$,小奇最初 ...