您现在的位置是:首页 >

udp首部如何看进程 recvfrom()详细资料大全

火烧 2022-10-11 18:38:43 1067
recvfrom 详细资料大全 本函式用于从(已连线)套接口上接收数据,并捕获数据传送源的地址。基本介绍中文名:recvfrom 作用:接收一个数据报并保存源地址类型: ocket支持协定:UDP/T
udp首部如何看进程 recvfrom()详细资料大全

recvfrom()详细资料大全  

本函式用于从(已连线)套接口上接收数据,并捕获数据传送源的地址。

基本介绍

中文名:recvfrom()作用:接收一个数据报并保存源地址类型:socket支持协定:UDP/TCP 函式简介,注释,详细介绍,其他函式比较,注意事项,

函式简介

接收一个数据报并保存源地址。(这里是windows中的头档案,Linux的用法在下面的那个实例) #include <winsock.h> int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen); s:标识一个已连线套接口的描述字。 buf:接收数据缓冲区。 len:缓冲区长度。 flags:调用操作方式。 from:(可选)指针,指向装有源地址的缓冲区。 fromlen:(可选)指针,指向from缓冲区长度值。

注释

本函式用于从(已连线)套接口上接收数据,并捕获数据传送源的地址。 对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设定为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程式可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。 对于数据报类套接口,伫列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函式返回WSAEMSGSIZE错误。 若from非零,且套接口为SOCK_DGRAM类型,则传送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。 如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。 如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连线,那么recvfrom()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。 在套接口的所设选项之上,还可用标志位flag来影响函式的执行方式。也就是说,本函式的语义既取决于套接口选项,也取决于标志位参数。标志位可取下列值: 值 意义 MSG_PEEK 查看当前数据。数据将被复制到缓冲区中,但并不从输入伫列中删除。 MSG_OOB 处理带外数据(参见2.2.3节具体讨论)。 返回值: 若无错误发生,recvfrom()返回读入的位元组数。如果连线已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程式可通过WSAGetLastError()获取相应错误代码。 错误代码: WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网路子系统失效。 WSAEFAULT:fromlen参数非法;from缓冲区大小无法装入端地址。 WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。 WSAEINVAL:套接口未用bind()进行捆绑。 WSAENOTCONN:套接口未连线(仅适用于SOCK_STREAM类型)。 WSAENOTSOCK:描述字不是一个套接口。 WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM类型的。 WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再用recv()接收数据。 WSAEWOULDBLOCK:套接口标识为非阻塞模式,但接收操作会产生阻塞。 WSAEMSGSIZE:数据报太大无法全部装入缓冲区,故被剪下。 WSAECONNABORTED:由于逾时或其他原因,虚电路失效。 WSAECONNRESET:远端强制中止了虚电路。 参见: recv(), send(), socket(), WSAAsyncSelect().

详细介绍

recvfrom  recvfrom函式(经socket接收数据): 函式原型:int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen); 相关函式 recv,recvmsg,send,sendto,socket 函式说明:recv()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的记忆体空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网路地址,结构sockaddr请参考bind()函式.参数fromlen为sockaddr的结构长度. 返回值:成功则返回接收到的字元数,失败返回-1. 错误代码 EBADF 参数s非合法的socket处理代码 EFAULT 参数中有一指针指向无法存取的记忆体空间。 ENOTSOCK 参数s为一档案描述词,非socket。 EINTR 被信号所中断。 EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。 ENOBUFS 系统的缓冲记忆体不足 ENOMEM 核心记忆体不足 EINVAL 传给系统调用的参数不正确。 范例 #include<sys/stat.h> #include<ftl.h> #include<unistd.h> #include<sys/typs.h> #include<sys/socket.h> #include<i/in.h> #include<arpa/i.h> #define PORT 2345 #define SERVER_IP “127.0.0.1” main() { int s,len; struct sockaddr_in addr; int addr_len =sizeof(struct sockaddr_in); char buffer[256]; if((s = socket(AF_INET,SOCK_DGRAM,0))<0){ perror(“socket”); exit(1); } bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = i_addr(SERVER_IP); while(1){ bzero(buffer,sizeof(buffer)); len =read(STDIN_FILENO,buffer,sizeof(buffer)); sendto(s,buffer,len,0,&addr,addr_len); len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len); printf(“receive: %s”,buffer); } } 执行 (先执行udp server 再执行udp client) hello receive: hello

其他函式比较

与recv()函式的比较:UDP使用recvfrom()函式接收数据,他类似于标准的read(),但是在recvfrom()函式中要指明目的地址。从套接字上接收一个讯息。对于recvfrom ,可同时套用于面向连线的和无连线的套接字。recv一般只用在面向连线的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设定NULL。不管是recv还是recvfrom,都有两种模式,阻塞和非阻塞,可以通过ioctl函式来设定。阻塞模式是一直等待直到有数据到达,非阻塞模式是立即返回,需要通过讯息,异步事件等来查询完成状态。

注意事项

第三个参数:len的值不能小于传送端的数据长度,否则会出现函式的返回结果(接收长度)为-1,而第二个参数buf 却有数据的现象。  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码