南宁网站建设seo,岳阳网站设计,网站建设单页面推广模板,网站制作公司 恶意在 Linux 和 Windows 系统中#xff0c;都可以将 socket 设置为非阻塞模式。
Linux平台
在 Linux 系统中#xff0c;可以使用 fcntl 函数来设置 socket 为非阻塞模式。例如#xff1a;
int flags fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NO…在 Linux 和 Windows 系统中都可以将 socket 设置为非阻塞模式。
Linux平台
在 Linux 系统中可以使用 fcntl 函数来设置 socket 为非阻塞模式。例如
int flags fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);
此外Linux 还提供了一个 accept4 函数可以直接将返回的 socket 设置为非阻塞模式
int client_fd accept4(server_fd, (struct sockaddr *)client_addr, client_addr_len, SOCK_NONBLOCK);
设置阻塞模式默认阻塞模式不用单独设置
int flags fcntl(socket_fd, F_GETFL, 0);
fcntl(socket_fd, F_SETFL, flags | ~O_NONBLOCK);
Windows平台
在 Windows 系统中可以使用 ioctlsocket 函数来设置 socket 为非阻塞模式。例如
u_long mode 1;
ioctlsocket(socket_fd, FIONBIO, mode);
设置阻塞模式
u_long mode 0;
ioctlsocket(socket_fd, FIONBIO, mode);
封窗两个函数方便调用
设置非阻塞模式 void SetNonBlocking(SOCKET sockfd) 设置阻塞模式 void SetBlocking(SOCKET sockfd)
#ifdef __GNUC__
#define SOCKET int
#elif defined(_WIN32)
#endifvoid SetNonBlocking(SOCKET sockfd){
#ifdef _WIN32unsigned long flag 1;if(ioctlsocket(sockfd, FIONBIO, flag) SOCKET_ERROR){
#elseint cflags fcntl(sockfd, F_GETFL, 0); if(fcntl(sockfd, F_SETFL, cflags | O_NONBLOCK) -1){
#endifstd::cerr ioctlsocket or fcntl set non blocking error std::endl;exit(-1);}
}void SetBlocking(SOCKET fd){
#ifdef _WIN32unsigned long flag 0;if(ioctlsocket(sockfd, FIONBIO, flag) SOCKET_ERROR){
#elseint cflags fcntl(sockfd, F_GETFL, 0); if(fcntl(sockfd, F_SETFL, cflags ~O_NONBLOCK) -1){
#endifstd::cerr ioctlsocket or fcntl set non blocking error std::endl;exit(-1);}
}