recv阻塞与非阻塞,recvfrom是阻塞函数吗
- 软件开发
- 2024-05-21
- 76
...recvfrom( 不是会阻塞吗,有谁能帮忙解决下啊?你的UDP服务器的代码写的是对的。recvfrom()也应该是会阻塞的。你可以在printf(daole);...
...recvfrom()不是会阻塞吗,有谁能帮忙解决下啊?
你的UDP服务器的代码写的是对的。recvfrom()也应该是会阻塞的。你可以在printf(daole);前加一句printf(%s\n,Buf);来看recvfrom()不阻塞,是不是收到了什么。
方法 用setsockopt设置阻塞超时时间,recvfrom阻塞一段超时后,退出响应其他线程的消息。方法 主线程直接把recvfrom的socket close掉,recvfrom会报错退出。
推荐用非阻塞的的方式。如果非要用阻塞的方式,可以把recvfrom放在一个子线程里,recvfrom完成后子线程即退出,主线程中在启动子线程后使用WaitForSingleObject(子线程句柄,等待时间),来等待子线程退出。
recvfrom()会发生阻塞,直到收到数据才会返回。调用成功返回收到数据的字节数,调用失败返回SOCKET_ERROR错误,没收到数据不等于调用失败。
UDP的client端是需要bind的,server端不需要bind,关于阻塞的问题,应该在于你的socket的属性,设置成O_NONBLOCK就可以了。
C语言下socket的recvfrom函数问题
1、视SOCKET是否阻塞而定,如果是阻塞的则会卡住,如果非阻塞则会立即返回。
2、recvfrom函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。
3、若无错误发生,recvfrom()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。错误代码:WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
4、深入探索recvfrom函数:高效接收socket数据的艺术 在网络编程的世界里,recvfrom函数扮演着至关重要的角色。
5、既然把分给了我就应该帮你解决的,这是一个简单的聊天室,测试后可以。你看下源代码好了。服务器端程序:1,创建套接字(socket)。2,将套接字绑定到本地地址和端口上(bind)。3,等待接受数据(recvfrom)。4,关闭套接字。
recvfrom()的与recv()函数的比较
1、UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是在recvfrom()函数中要指明目的地址。从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
2、recv()和recvfrom()区别是:含义不同、用法不同、侧重点不同 含义不同 recv abbr. 接收;收到(receive)。recv from 收到来自?。用法不同 recv receive的基本意思是“接受”“收到”,仅指接到或收到某物的客观事实,而不表示主观态度(接受或拒绝)。
3、首先,recv()和recvfrom()都是用于UDP和TCP协议中的数据接收,但是它们处理的套接字类型有所不同。recv()函数通常用于处理已连接的套接字,如TCP套接字,而recvfrom()函数则用于处理无连接的套接字,如UDP套接字。
4、recv的recvfrom是可以替换使用的,只是recvfrom多了两个参数,可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。
5、不太清楚,recv一般用于tcp,因为tcp有有链接的,在recv调用中不需要知道对方是谁。recvfrom一般用于udp,参数中可以传回对方是谁的信息。
UDP方式recvfrom接收函数为什么有时是阻塞,而有时是非阻塞的
1、看来sendto函数发送失败(IP地址无接收端口),导致recvfrom的失败。(对方机器强行关闭)请采纳。
2、UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是在recvfrom()函数中要指明目的地址。从套接字上接收一个消息。对于recvfrom ,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
3、recvfrom和sendto都是阻塞的。通常来说,由于网络连接具有缓冲区,sendto函数直接将数据复制至缓冲区后即可认为操作完成,因此很少阻塞(除非缓冲区已满,它才会等待缓冲区足够写入后才能操作);而recvfrom是从缓冲区读数据,如果没有数据则会一直阻塞。
4、UDP的client端是需要bind的,server端不需要bind,关于阻塞的问题,应该在于你的socket的属性,设置成O_NONBLOCK就可以了。
5、接收选用recv(这里特指TCP)以及recvfrom(这里特指UDP)来描述 在阻塞模式下recv,recvfrom操作将会阻塞 到缓冲区里有至少一个字节(TCP)或者一个完整UDP数据报才返回。在没有数据到来时,对它们的调用都将处于睡眠状态,不会返回。在非阻塞模式下recv,recvfrom操作将会立即返回。
本文链接:http://xinin56.com/ruanjian/189631.html
上一篇:有些苹果手机为什么这么便宜