<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>recvfrom</title>
	<atom:link href="https://www.aitaocui.cn/tag/260944/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Mon, 28 Nov 2022 11:43:55 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>recvfrom</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>recvfrom(数学定义)</title>
		<link>https://www.aitaocui.cn/article/373150.html</link>
					<comments>https://www.aitaocui.cn/article/373150.html#respond</comments>
		
		<dc:creator><![CDATA[天下有雪]]></dc:creator>
		<pubDate>Mon, 28 Nov 2022 11:43:55 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[recvfrom]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=373150</guid>

					<description><![CDATA[recvfrom函数(经socket接收数据):函数原型:ssize_trecvfrom(intsockfd，void*buf，intlen，unsignedintflags，st...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>recvfrom函数(经socket接收数据):函数原型:ssize_trecvfrom(intsockfd，void*buf，intlen，unsignedintflags，structsockaddr*from，socket_t*fromlen)，ssize_t相当于int，socket_t相当于int，这里用这个名字为的是提高代码的自说明性。函数说明:recvfrom()用来接收远程主机经指定的socket传来的数据，并把数据传到由参数buf指向的内存空间，参数len为可接收数据的最大长度，参数flags一般设0，其他数值定义参考recv()，参数from用来指定欲传送的网络地址，结构sockaddr请参考bind()函数，参数fromlen为sockaddr的结构长度，</p>
</article>
<article>
<h1>参数</h1>
<p>sockfd：标识一个已连接套接口的描述字。</p>
<p>buf：接收数据缓冲区。</p>
<p>len：缓冲区长度。</p>
<p>flags：调用操作方式。是以下一个或者多个标志的组合体，可通过or操作连在一起:</p>
<p>MSG_DONTWAIT：操作不会被阻塞。</p>
<p>MSG_ERRQUEUE：指示应该从套接字的错误队列上接收错误值，依据不同的协议，错误值以某种辅佐性消息的方式传递进来，使用者应该提供足够大的缓冲区。导致错误的原封包通过msg_iovec作为一般的数据来传递。导致错误的数据报原目标地址作为msg_name被提供。错误以sock_extended_err结构形态被使用，定义如下</p>
<p>#defineSO_EE_ORIGIN_NONE0</p>
<p>#defineSO_EE_ORIGIN_LOCAL1</p>
<p>#defineSO_EE_ORIGIN_ICMP2</p>
<p>#defineSO_EE_ORIGIN_ICMP63</p>
<p>structsock_extended_err</p>
<p>{</p>
<p>u_int32_tee_errno，</p>
<p>u_int8_tee_origin，</p>
<p>u_int8_tee_type，</p>
<p>u_int8_tee_code，</p>
<p>u_int8_tee_pad，</p>
<p>u_int32_tee_info，</p>
<p>u_int32_tee_data，}，</p>
<p>MSG_PEEK：指示数据接收后，在接收队列中保留原数据，不将其删除，随后的读操作还可以接收相同的数据。</p>
<p>MSG_TRUNC：返回封包的实际长度，即使它比所提供的缓冲区更长，只对packet套接字有效。</p>
<p>MSG_WAITALL：要求阻塞操作，直到请求得到完整的满足。然而，如果捕捉到信号，错误或者连接断开发生，或者下次被接收的数据类型不同，仍会返回少于请求量的数据。</p>
<p>MSG_EOR：指示记录的结束，返回的数据完成一个记录。</p>
<p>MSG_TRUNC：指明数据报尾部数据已被丢弃，因为它比所提供的缓冲区需要更多的空间。</p>
<p>MSG_CTRUNC：指明由于缓冲区空间不足，一些控制数据已被丢弃。</p>
<p>MSG_OOB：指示接收到out-of-band数据(即需要优先处理的数据)。</p>
<p>MSG_ERRQUEUE：指示除了来自套接字错误队列的错误外，没有接收到其它数据。</p>
<p>from：（可选）指针，指向装有源地址的缓冲区。</p>
<p>fromlen：（可选）指针，指向from缓冲区长度值。</p>
<h1>返回值</h1>
<p>如果正确接收返回接收到的字节数，失败返回-1，</p>
<p>相关函数recv，recvmsg，send，sendto，socket</p>
<p>函数说明:recvfrom()用来接收远程主机经指定的socket传来的数据，并把数据传到由参数buf指向的内存空间，参数len为可接收数据的最大长度，参数flags一般设0，其他数值定义参考recv()，参数from用来指定欲传送的网络地址，结构sockaddr请参考bind()函数，参数fromlen为sockaddr的结构长度，相关函数：recv， recvmsg， send， sendto， socket</p>
<p>返回值:成功则返回接收到的字符数，失败返回-1，</p>
<p>错误代码</p>
<p>EBADF参数s非合法的socket处理代码</p>
<p>EFAULT参数中有一指针指向无法存取的内存空间。</p>
<p>ENOTSOCK参数s为一文件描述词，非socket。</p>
<p>EINTR被信号所中断。</p>
<p>EAGAIN此动作会令进程阻断，但参数s的socket为不可阻断。</p>
<p>ENOBUFS系统的缓冲内存不足</p>
<p>ENOMEM核心内存不足</p>
<p>EINVAL传给系统调用的参数不正确。</p>
<h1>范例</h1>
<p>，*利用socket的UDPclient</p>
<p>此程序会连线UDPserver，并将键盘输入的字符串传给server。</p>
<p>UDPserver范例请参考sendto</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#definePORT2345</p>
<p>#defineSERVER_IP“127，0，0，1”</p>
<p>main()</p>
<p>ints，len，</p>
<p>structsockaddr_inaddr，</p>
<p>intaddr_len=sizeof(structsockaddr_in)，</p>
<p>charbuffer，</p>
<p>，*建立socket*，</p>
<p>if((s=socket(AF_INET，SOCK_DGRAM，0))&lt;0){</p>
<p>perror(“socket”)，</p>
<p>exit(1)，</p>
<p>，*填写sockaddr_in*，</p>
<p>bzero(&amp;addr，sizeof(addr))，</p>
<p>addr，sin_family=AF_INET，</p>
<p>addr，sin_port=htons(PORT)，</p>
<p>addr，sin_addr，s_addr=inet_addr(SERVER_IP)，</p>
<p>while(1){</p>
<p>bzero(buffer，sizeof(buffer))，</p>
<p>，*从标准输入设备取得字符串*，</p>
<p>len=read(STDIN_FILENO，buffer，sizeof(buffer))，</p>
<p>，*将字符串传送给server端*，</p>
<p>sendto(s，buffer，len，0，(structsockaddr*)&amp;addr，addr_len)，</p>
<p>，*接收server端返回的字符串*，</p>
<p>len=recvfrom(s，buffer，sizeof(buffer)，0，(structsockaddr*)&amp;addr，&amp;addr_len)，</p>
<p>printf(“receive:%s”，buffer)，</p>
<p>执行(先执行udpserver再执行udpclient)</p>
<p>hello，*从键盘输入字符串*，</p>
<p>receive:hello，*server端返回来的字符串*，</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/373150.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
