前文中已经介绍了用于在通信双方进行收发数据的 recv,send 函数,
与本文中介绍的 sendto recvfrom 不同的是,它们属于在不同通信协议下的函数。
前者工作于面向连接的 TCP 通信协议下,后者工作于面向非连接的 UDP 通信协议下。
前者(send , recv)只有当通信的双方建立连接之后,通信双方才可以进行收发数据,
后者(sendto , recvfrom) 可以工作在双方没有建立连接的情况下,不过每次发送,接收数据的时候
便需要在函数中设定通信目的端的地址信息。
对于 sendto 和 recvfrom 来说,前者是每次发送数据都是现发现设定目的地址(现通讯现连接),
后者是接收到的数据中还包含着发送数据一方的网络地址信息,以便于回复信息的时候不知道
该向那个通讯端发送数据。
sendto 函数API 描述
#include
#include
ssize_t sendto ( int s , const void * msg , socklen_t len , int flags ,
const struct sockaddr *to , socklen_t to_len ) ;
参数
1. s : 套接字描述符,如果调用方法 sendto 是通信双方中的 client端的话,是无需调用 connect 方 法的;如果是 server 端的话,是无需调用 accept 方法来返回新的套接字描述符的,
首个参数使用 一开始socket 函数调用的返回值即可
2. msg : 该参数是一个指针,指向的是待发送数据所存放的缓冲区
3. len : 该参数是用来标定待发送的数据有多少个字节
4. flags : 该参数的用法同 send 函数中的 flags ,它是用来设定发送到对端的数据的类型以及发送方式
5. to : 由于 sendto 是 UDP 网络传输协议的实现,是不面向连接的,所以每次发送数据的时候,
都会通过该函数来指定接收数据的目的端的网络地址信息
6. to_len : 我们应该清楚的是,参数5 所传递的仅仅是指向一块空间的指针,该指针所指向空间中的有效
数据有多少是无法通过指针来得知的,所以需要传送一个用来标定该指针指向的空间中有多少个
字节的信息是有效的, to_len 用于标定 to 指向的空间中地址数据所占用的字节个数
返回值: 函数的返回值表明了成功将多少字节的数据从进程内存发送到内核中的缓冲空间中。
成功发送并不代表成功的将数据发送到对方的主机上(很难说这边发送了多少,对方就能够完全正确的接收)
因为网络中数据的传输要远比语言中抽象表达的要复杂,延迟、丢包等等都有可能导致成功发送的
数据不能全部被对方接收
recvfrom 函数API 描述
#include
#include
ssize_t recvfrom ( int s , void *buf , ssize_t len , int flags ,
struct sockaddr * from , socklen_t *fromlen ) ;
参数
1. s : 套接字描述符,client 端调用 socket 函数的返回值, server 端在调用
socket , bind 函数成功之后,socket 函数的返回值。
2. buf: 指向在进程内存中存放来自于内核缓冲区接收到的数据,系统首先会从网络中收集数据,然后将
数据从内核缓冲区中移动到通讯进程的内存空间中, 而 buf 便是指向内存空间的指针。
3. len : 该参数用来告诉内核内存空间的最大容量是多少,内核每次将内核缓冲区中的数据移到内存空间中的时候,
会根据内存空间的大小 len 来移动指定数目的数据
4. flags : 该参数用来 控制或限制 接收数据一端,应该接收什么何种类型的数据,用法同 recv 中 flags 参数的的用法
5. from : 该参数也是 值-结果 参数,用来指向一块空闲空间,在 recvfrom 方法调用之后,该空闲空间中将会
被写入发送数据的通信端的网络地址信息,如果数据接收端需要知道数据发送端的网络地址信息,
将写入该指针指向的空间中的数据便可获知
6. fromlen : 参数 5 地址指针所指向的空间中,有效数据的长度是多少
实例代码
同博文 http://blog.chinaunix.net/uid-28595538-id-4923028.html 中示例代码
阅读(8125) | 评论(0) | 转发(0) |