如何理解send,linux sendto返回值的返回值

本帖子已过去太久远了,不再提供回复功能。功能描述:发送消息。send只可用于基于连接的套接字,send 和 write唯一的不同点是标志的存在,当标志为0时,send等同于write。sendto 和 sendmsg既可用于无连接的套接字,也可用于基于连接的套接字。除了套接字设置为非阻塞模式,调用将会阻塞直到数据被发送完。 用法: #include &sys/types.h&#include &sys/socket.h& ssize_t send(int sock, const void *buf, size_t len, int flags);ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);ssize_t sendmsg(int sock, const struct msghdr *msg, int flags);参数:
sock:索引将要从其发送数据的套接字。buf:指向将要发送数据的缓冲区。len:以上缓冲区的长度。flags:是以下零个或者多个标志的组合体,可通过or操作连在一起MSG_DONTROUTE:不要使用网关来发送封包,只发送到直接联网的主机。这个标志主要用于诊断或者路由程序。MSG_DONTWAIT:操作不会被阻塞。MSG_EOR:终止一个记录。MSG_MORE:调用者有更多的数据需要发送。MSG_NOSIGNAL:当另一端终止连接时,请求在基于流的错误套接字上不要发送SIGPIPE信号。MSG_OOB:发送out-of-band数据(需要优先处理的数据),同时现行协议必须支持此种操作。to:指向存放接收端地址的区域,可以为NULL。tolen:以上内存区的长度,可以为0。msg:指向存放发送消息头的内存缓冲,结构形态如下struct msghdr {
struct iovec *msg_
};可能用到的数据结构有struct cmsghdr {
socklen_t cmsg_
};返回说明:
成功执行时,返回已发送的字节数。失败返回-1,errno被设为以下的某个值
EACCES:对于Unix域套接字,不允许对目标套接字文件进行写,或者路径前驱的一个目录节点不可搜索EAGAIN,EWOULDBLOCK: 套接字已标记为非阻塞,而发送操作被阻塞EBADF:sock不是有效的描述词ECONNRESET:连接被用户重置EDESTADDRREQ:套接字不处于连接模式,没有指定对端地址EFAULT:内存空间访问出错EINTR:操作被信号中断EINVAL:参数无效EISCONN:基于连接的套接字已被连接上,同时指定接收对象EMSGSIZE:消息太大ENOMEM:内存不足ENOTCONN:套接字尚未连接,目标没有给出ENOTSOCK:sock索引的不是套接字EPIPE:本地连接已关闭
阅读(...) 评论()博客访问: 2893867
博文数量: 251
博客积分: 5347
博客等级: 大校
技术积分: 13540
注册时间:
认证徽章:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
从网上查到了一些关于这几个函数的使用及注意事项,现终结如下:功能描述:发送消息,send只可用于基于连接的套接字,send 和
write唯一的不同点是标志的存在,当标志为0时,send等同于write。sendto 和
sendmsg既可用于无连接的套接字,也可用于基于连接的套接字。除了套接字设置为非阻塞模式,调用将会阻塞直到数据被发送完。
#include &sys/types.h&
#include &sys/socket.h&
ssize_t send(int sock, const void *buf, size_t len, int flags);
ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
ssize_t sendmsg(int sock, const struct msghdr *msg, int flags);参数:& sock:索引将要从其发送数据的套接字。buf:指向将要发送数据的缓冲区。len:以上缓冲区的长度。flags:是以下零个或者多个标志的组合体,可通过or操作连在一起
MSG_DONTROUTE:不要使用网关来发送封包,只发送到直接联网的主机。这个标志主要用于诊断或者路由程序。MSG_DONTWAIT:操作不会被阻塞。MSG_EOR:终止一个记录。MSG_MORE:调用者有更多的数据需要发送。MSG_NOSIGNAL:当另一端终止连接时,请求在基于流的错误套接字上不要发送SIGPIPE信号。MSG_OOB:发送out-of-band数据(需要优先处理的数据),同时现行协议必须支持此种操作。to:指向存放接收端地址的区域,可以为NULL。tolen:以上内存区的长度,可以为0。msg:指向存放发送消息头的内存缓冲,结构形态如下
struct msghdr {&&& void&&&&&&&& *msg_&&&&& &&& socklen_t&&&& msg_&& &&& struct iovec *msg_&&&&&& &&& size_t&&&&&&& msg_&&& &&& void&&&&&&&& *msg_&& &&& socklen_t&&&& msg_&&& int&&&&&&&&&& msg_&&&& };
可能用到的数据结构有
struct cmsghdr {&&& socklen_t cmsg_&&& &&& int&&&&&& cmsg_& &&& int&&&&&& cmsg_&& && };返回说明:& 成功执行时,返回已发送的字节数。失败返回-1,errno被设为以下的某个值& EACCES:对于Unix域套接字,不允许对目标套接字文件进行写,或者路径前驱的一个目录节点不可搜索EAGAIN,EWOULDBLOCK: 套接字已标记为非阻塞,而发送操作被阻塞EBADF:sock不是有效的描述词ECONNRESET:连接被用户重置EDESTADDRREQ:套接字不处于连接模式,没有指定对端地址EFAULT:内存空间访问出错EINTR:操作被信号中断EINVAL:参数无效EISCONN:基于连接的套接字已被连接上,同时指定接收对象EMSGSIZE:消息太大ENOMEM:内存不足ENOTCONN:套接字尚未连接,目标没有给出ENOTSOCK:sock索引的不是套接字EPIPE:本地连接已关闭#include &sys/socket.h&
#include &netinet/in.h&
#include &unistd.h&
void Recv()
&&&struct sockaddr_in serv_addr;
&&&int sock_fd;
&&&char line[15] = "Hello world!";
&&&int size = 13;
&&&serv_addr.sin_family = AF_INET;
&&&serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
&&&serv_addr.sin_port = htons(5000);
&&&sock_fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
&&&connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
&&&send(sock_fd, line, size, 0);
&&&close(sock_fd);
}#include &sys/socket.h&
#include &netinet/in.h&
#include &unistd.h&
void Sendto()
&&&sockaddr_in receiver_addr;
&&&int sock_fd;
&&&char line[15] = "Hello World!";
&&&sock_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
&&&receiver_addr.sin_family = AF_INET;
&&&receiver_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
&&&receiver_addr.sin_port = htons(5000);
&&&sendto(sock_fd, line, 13, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr));
&&&close(sock_fd);
}#include &sys/socket.h&
#include &netinet/in.h&
#include &unistd.h&
void sendmsg()
&&&struct sockaddr_in receiver_addr;
&&&int sock_fd;
&&&char line[15] = "Hello World!";
&&&struct msghdr msg;
&&&struct iovec iov;
&&&sock_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
&&&receiver_addr.sin_family = AF_INET;
&&&receiver_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
&&&receiver_addr.sin_port = htons(5000);
&&&msg.msg_name = &receiver_addr;
&&&msg.msg_namelen = sizeof(receiver_addr);
&&&msg.msg_iov = &iov;
&&&msg.msg_iovlen = 1;
&&&msg.msg_iov-&iov_base = line;
&&&msg.msg_iov-&iov_len = 13;
&&&msg.msg_control = 0;
&&&msg.msg_controllen = 0;
&&&msg.msg_flags = 0;
&&&sendmsg(sock_fd,&msg,0);
&&&close(sock_fd);
阅读(11704) | 评论(1) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
招聘启示:
工作职责:
负责QQ后台服务器的开发
负责大容量网络服务后台架构开发
工作要求:
责任感强、有较强的逻辑思维能力、沟通能力、能够承担工作压力;
熟悉LINUX/UNIX开发环境,熟悉网络开发;
计算机或相关专业本科及以上学历,二年以上相关工作经验;
具有两年以上互联网业务开发经验或大容量网络服务相关经验者优先;
有后台业务开发、维护经验优先。
职位工作地:【深圳】
请登录后评论。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
在绝望中寻找希望
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(4879)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084066',
blogTitle:'send和recv解释 ',
blogAbstract:'int send(int s, const void *msg, size_t len,
int flags);
flags取值有:0: 与write()无异MSG_DONTROUTE:告诉内核,目标主机在本地网络,不用查路由表MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式MSG_OOB:指明发送的是带外信息int recv(int s, void *buf, size_t len, int flags);flags取值有:0:常规操作,与read()相同MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式MSG_OOB:指明发送的是带',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'在绝望中寻找希望',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 send 返回值 的文章

 

随机推荐