今天宠物迷的小编给各位宠物饲养爱好者分享recv非阻塞设置的宠物知识,其中也会对VC中使用API编写的socket程序中如何设置阻塞和非阻塞accept进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!
关于阻塞和非阻塞概念,可能有些初学编程的人不是很清楚. 阻塞是指在函数执行时如果条件不满足,程序将永远停在那条函数那里不在往下执行,而非阻塞则是函数不管条件是否满足都会往下执行.例如在通讯过程中,当接收数据的时候,对于阻塞方式,程序将一直等到接收到数据才向下执行,而对于非阻塞方式,不管是否接收到数据,接收函数将被执行过去.一个比较完善的程序一般来讲都使用非阻塞的方式来进行.原因在于如果采用阻塞方式,程序将停在那里一直等待条件满足,正常情况下是没有问题的,但如果你想停止阻塞的程序,就出现了比较麻烦的问题. 对于VC中使用API方式进行的SOCKET编程,需要使用下面的函数来设置阻塞方式和非阻塞方式: ioctlsocket(gListenSocket, FIONBIO,&tBlockMode); //tBlockMode 0--block,1--no block ioctlsocket(gWorkSocket, FIONBIO,&tBlockMode); 注意,在开发server端程序时,这样设置会控制**socket的accept()函数的阻塞和非阻塞模式,也可以设置工作socket的recv函数的阻塞和非阻塞模式.设置了非阻塞模式,可以使用查询方式进行accept和recv函数执行.
UDP的client端是需要bind的,server端不需要bind,
关于阻塞的问题,应该在于你的socket的属性,设置成O_NONBLOCK就可以了。
关于阻塞和非阻塞概念,可能有些初学编程的人不是很清楚. 阻塞是指在函数执行时如果条件不满足,程序将永远停在那条函数那里不在往下执行,而非阻塞则是函数不管条件是否满足都会往下执行.例如在通讯过程中,当接收数据的时候,对于阻塞方式,程序将一直等到接收到数据才向下执行,而对于非阻塞方式,不管是否接收到数据,接收函数将被执行过去.一个比较完善的程序一般来讲都使用非阻塞的方式来进行.原因在于如果采用阻塞方式,程序将停在那里一直等待条件满足,正常情况下是没有问题的,但如果你想停止阻塞的程序,就出现了比较麻烦的问题. 对于VC中使用API方式进行的SOCKET编程,需要使用下面的函数来设置阻塞方式和非阻塞方式: ioctlsocket(gListenSocket, FIONBIO,&tBlockMode); //tBlockMode 0--block,1--no block ioctlsocket(gWorkSocket, FIONBIO,&tBlockMode); 注意,在开发server端程序时,这样设置会控制**socket的accept()函数的阻塞和非阻塞模式,也可以设置工作socket的recv函数的阻塞和非阻塞模式.设置了非阻塞模式,可以使用查询方式进行accept和recv函数执行.
方法1: 新开线程,在线程中recv,则对主线程无影响;
方法2:采用异步方式;
代码就不说了,复杂,多,估计也没人愿意花时间给你去找资料贴代码....
你自己去百度搜下多线程或异步方式。
怕 ulimit -SHn 51200 失效 所以 我先修改了 /etc/security/limits***nf 有在 /etc/profile 和 /etc/rc.local 都添加了 ulimit -SHn 51200 profile 是 用户登录 就自动调用的 rc.local 是 开机自动调用 这样就不怕 失效了
没开服务器执行客户端recvfrom确实返回SOCKET_ERROR。WSAGetLastError返回值10054(WSAECONNRESET )A existing connection was forcibly closed by the remote host.
看来sendto函数发送失败(IP地址无接收端口),导致recvfrom的失败。(对方机器强行关闭)
请采纳。
方法1. 用setsockopt设置阻塞超时时间,recvfrom阻塞一段超时后,退出响应其他线程的消息。 方法2. 主线程直接把recvfrom的socket close掉,recvfrom会报错退出。
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“VC中使用API编写的socket程序中如何设置阻塞和非阻塞accept”
上一篇
宠物应激时机体的神经与内分泌反应
下一篇
儿童擦哪种面霜好?