recvfrom阻塞
关于UDP接收ICMP端口不可达报文的两种方法 -
如果服务端启动udptest_server,客户端启动udptest_client,客户端正常接收如果服务端不启动udptest_server,客户端启动udptest_client后,客户端阻塞在recvfrom调用,虽然内核收到了ICMP端口不可达报文,但是用户态完全无感知recvfrom调用会阻塞,即使收到ICMP端口不可达报文,也会阻塞,但是经过第一种方法后面会介绍。
方法1. 用setsockopt设置阻塞超时时间,recvfrom阻塞一段超时后,退出响应其他线程的消息。方法2. 主线程直接把recvfrom的socket close掉,recvfrom会报错退出。
如果服务端启动udptest_server,客户端启动udptest_client,客户端正常接收如果服务端不启动udptest_server,客户端启动udptest_client后,客户端阻塞在recvfrom调用,虽然内核收到了ICMP端口不可达报文,但是用户态完全无感知recvfrom调用会阻塞,即使收到ICMP端口不可达报文,也会阻塞,但是经过第一种方法后面会介绍。
方法1. 用setsockopt设置阻塞超时时间,recvfrom阻塞一段超时后,退出响应其他线程的消息。方法2. 主线程直接把recvfrom的socket close掉,recvfrom会报错退出。
recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。不管是recv还是recvfrom,都有两种模式,阻塞和非阻塞,可以通过ioctl函数来设置。阻塞模式是一直等待直到有数据到达,非阻塞模式是立即返回,需要通过消息,异步事件等来查询完成状态。
服务器有没有收到数据,抓个包看看就行了。recvfrom和sendto都是阻塞的。通常来说,由于网络连接具有缓冲区,sendto函数直接将数据复制至缓冲区后即可认为操作完成,因此很少阻塞(除非缓冲区已满,它才会等待缓冲区足够写入后才能操作);而recvfrom是从缓冲区读数据,如果没有数据则会一直阻塞。解决阻塞等我继续说。
recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗? -
1.一次recvfrom()调用只能返回一个UDP数据包。2.send()函数参数中的buffer长度有限制,此长度限制取决于底层协议的数据包最大长度,这个长度可以通过getsockopt函数设置SO_MAX_MSG_SIZE参数获得,如果发送的数据包超过底层协议的最大长度则返回WSAEMSGSIZE错误,同时不发送任何数据。sendto()函数参数中的希望你能满意。
一:同步阻塞它是最简单也最常用的网络IO模型。linux下默认的socket都是blocking的。从图中可以看到,用户进程调用recvfrom这个系统调用后,就处于阻塞状态。然后kernel就开始了IO的第一个阶段:数据准备。等第一个阶段准备完成之后,kernel开始第二阶段,将数据从内核缓冲区拷贝到用户程序缓冲区(需要花费一定时间)。然后后面会介绍。
关于recvfrom()不阻塞时的等待时间问题,请帮忙~~ -
如果非要用阻塞的方式,可以把recvfrom放在一个子线程里,recvfrom完成后子线程即退出,主线程中在启动子线程后使用WaitForSingleObject(子线程句柄,等待时间),来等待子线程退出。若等待超时子线程还没有退出,在主线程中调用closesocket,这样子线程中阻塞的recvfrom会立即返回,这样主线程就可以进行下一步等我继续说。
若无错误发生,recvfrom()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。错误代码:WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。WSAEFAULT:fromlen参数到此结束了?。
Linux网络 - 数据包在内核中接收和发送的过程(转) -
应用层一般有两种方式接收数据,一种是recvfrom函数阻塞在那里等着数据来,这种情况下当socket收到通知后,recvfrom就会被唤醒,然后读取接收队列的数据;另一种是通过epoll或者select监听相应的socket,当收到通知后,再调用recvfrom函数去读取接收队列的数据。两种情况都能正常的接收到相应的数据包。了解数据是什么。
在非阻塞模式下recv,recvfrom操作将会立即返回。如果缓冲区有任何一个字节数据(TCP)或者一个完整UDP数据报,它们将会返回接收到的数据大小。而如果没有任何数据则返回错误WSAEWOULDBLOCK/E WOULDBLOCK。以上是关于阻塞非阻塞发送接收的区别以及在缓冲区处理上的差别,希望给看到这篇文章的人一些帮助。同时有帮助请点赞。