第1关:阻塞
#include <sys/socket.h> // 包含套接字函数库 #include <fcntl.h> void setsocketblock(int socketID) { /*******Begin*********/ int flags = fcntl (socketID, F_GETFL, 0); //检查当前属性是否为BLOCK,否则将其设置为BLOCK if (flags & O_NONBLOCK) { fcntl (socketID, F_SETFL, flags&~O_NONBLOCK); int recvTimeout = 5 * 1000; setsockopt(socketID,SOL_SOCKET,SO_RCVTIMEO,(char *)&recvTimeout,sizeof(int)); } /********End*********/ }
第2关:非阻塞
#include <sys/socket.h> // 包含套接字函数库 #include <fcntl.h> void setsocketunblock(int socketID) { /*******Begin*********/ int flags = fcntl (socketID, F_GETFL, 0); //检查当前属性是否为NON_BLOCK,否则将其设置为NON_BLOCK if (0 == (flags & O_NONBLOCK)) { fcntl (socketID, F_SETFL, flags|O_NONBLOCK); } /********End*********/ }
第3关:阻塞与非阻塞切换
#include <sys/socket.h> // 包含套接字函数库 #include <fcntl.h> void setsocketunblock(int socketID) { /*******Begin*********/ int flags = fcntl (socketID, F_GETFL, 0); //检查当前属性是否为NON_BLOCK,否则将其设置为NON_BLOCK if (0 == (flags & O_NONBLOCK)) { fcntl (socketID, F_SETFL, flags|O_NONBLOCK); } /********End*********/ } void setsocketblock(int socketID) { /*******Begin*********/ int flags = fcntl (socketID, F_GETFL, 0); //检查当前属性是否为BLOCK,否则将其设置为BLOCK if (flags & O_NONBLOCK) { fcntl (socketID, F_SETFL, flags&~O_NONBLOCK); int recvTimeout = 5 * 1000; setsockopt(socketID,SOL_SOCKET,SO_RCVTIMEO,(char *)&recvTimeout,sizeof(int)); } /********End*********/ }