13.2.7 发送与接收数据
当服务器与客户机之间成功建立连接后,可以调用read和write函数来实现对套接字的读写,以实现网络中不同主机间的通信。Linux系统还提供了send和recv函数,用于实现与read和write函数相同的功能。而且send和recv的功能要比read函数和write函数更为全面。send函数的具体信息如表13.8所示。
表13.8 send函数
|
头文件 |
| ||
|
函数形式 |
ssize_t send(int s, const void *buf, size_t len, int flags); | ||
|
返回值 |
成功 |
失败 |
是否设置errno |
|
返回实际发送的数据的字节数 |
−1 |
是 | |
说明:send函数用于将信息发送到指定的套接字文件描述符中。该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要发送数据的套接字文件描述符。buf参数为指向要发送数据的指针。len为要发送数据的长度。flag参数可以包含如下的参数。
MSG_CONFIRM(Linux 2.3以上的内核版本支持):通知数据链路层发生了转发,且得到了通信另一段的回应。如果链路层没有得到回应,将使用ARP或其他协议来探测网络上的主机。该参数只用于SOCK_DGRAM和SOCK_RAW类型的套接字。
MSG_DONTROUTE:不通过网关发送数据,只将数据发送到同一子网中的计算机。该参数通常用于诊断或路由程序中,只用于路由的协议族中,包套接字不能使用该参数。
MSG_DONTWAIT:使用非阻塞操作。如果操作将阻塞,并返回EAGAIN错误。
MSG_EOR:结束记录(当套接字类型是SOCK_SEQPACKET时使用)。
MSG_MORE(Linux 2.4.4以上内核版本支持):调用者有更多的数据要发送。
MSG_OOB:通过套接字发送带外数据(套接字需要支持这一行为,例如,使用SOCK_STREAM类型的套接字)。
write函数与send函数在flag为0时的功能相同。
错误信息:
下面列出send函数常见的错误信息。
EBADF:非法的文件描述。
ECONNRESET:连接重置。
EDESTADDRREQ:在套接字操作中没有指定目标地址。
EFAULT:参数指向了非法的地址空间。
EINTR:数据发送前,捕获到信号。
EINVAL:非法参数。
ENOTSOCK:参数非套接字的文件描述符。
ENOMEM:内存不足。
recv函数可以实现从指定套接字中读取发送来的消息,该函数的具体信息如表13.9所示。
表13.9 recv函数
|
头文件 |
| ||
|
函数形式 |
ssize_t recv(int s, void *buf, size_t len, int flags); | ||
|
返回值 |
成功 |
失败 |
是否设置errno |
|
0 |
−1 |
是 | |
说明:recv函数用于从指定套接字中获取发送的消息。与send函数一样,该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要读取信息的套接字文件描述符。buf参数为指向要保存数据缓冲区的指针。而len为该缓存的最大长度。
参数flags可以包含如下的标志。
MSG_DONTWAIT:使用非阻塞操作。如果操作将阻塞,将返回EAGAIN错误。
MSG_OOB:通过套接字发送带外数据(套接字需要支持这一行为,例如使用SOCK_STREAM类型的套接字)。
MSG_PEEK:该标志表示从接收队列的开始处查看数据,而不从缓冲区中删除数据。
MSG_TRUNC:返回包的真实长度,即使该长度超出了传递的缓存长度。该标志只用于流套接字。
MSG_WAITALL:该标志将使得操作处于阻塞状态,直到获得全部数据
当flags参数为0时,recv函数等同与read函数的功能。
错误信息:
EAGAIN:在接收到数据前,接收操作处于阻塞或直至超时。
EBADF:非法的文件描述符。
ECONNABORTED:远程主机拒绝网络连接。
EFAULT:指向接收数据的缓冲区指针指向了非法地址空间。
EINTR:系统调用被信号中断。
EINVAL:非法参数。
ENOTCONN:套接字使用了面向连接的协议,但是并没有建立连接。
ENOTSOCK:文件描述符为文件的文件描述符。
| 回书目 上一节 下一节 |
|
· 第六章 你能帮我吗?.. · Linux笔试面试题选摘测.. · 08年5月软考网管上午真.. · 性能测试从零开始 目录 · 08年5月软考网工上午真.. · 上周拒绝服务攻击(DDo.. |
· 08年5月各大网上书店及.. · 2008年5月24日软考试题.. · 软件设计师专家临考模.. · 上周网络管理员专家自.. · 网络工程师自测获奖名.. · 08年4月各大网上书店及.. |
|
||||
| · NAC安全访问控制 · 网络布线测试仪器 · Windows Server 2008专.. · Windows远程桌面应用 · 网络故障排除宝典 · 运营商封堵ADSL共享 中.. · 解析35岁技术人的价值.. · 世纪枭雄比尔盖茨的王.. |
· 主流品牌防火墙配置 · ASP.NET开发教程 · 超级计算机TOP500专题 · Vista SP1对决XP SP3 · SQL Server 2008/2005.. · 程序员如何成长? · C#技术开发指南 · 虚拟化技术还有点“虚” |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · Windows远程桌面应用 · C#技术开发指南 · Apache技术专题 |
· Windows集群服务应用 · C#技术开发指南 · 国际文档格式标准开战 · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 · 企业数据恢复指南 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 反垃圾邮件技术应用 |
|||