我们先来看一个阻塞的socket程序:

 

#include <stdio.h>
#include <winsock2.h>   
#pragma comment(lib, "ws2_32.lib")   

int main()
{
	// 网络初始化
	WSADATA wsd;   
    WSAStartup(MAKEWORD(2,2), &wsd);

    SOCKET sServer = socket(AF_INET,SOCK_STREAM, 0);   
   

    // 设置服务器套接字地址   
    SOCKADDR_IN addrServ;   
    addrServ.sin_family = AF_INET;   
    addrServ.sin_port = htons(8888);
    addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    
    bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN));   
   

	// 用耳朵听听
    listen(sServer, 5);   
    

    // 接受客户请求 
	printf("accept\n");
    sockaddr_in addrClient;
    int len = sizeof(addrClient);   
	SOCKET sClient = accept(sServer,(sockaddr FAR*)&addrClient, &len);   
	printf("%d, %d, %d, %d\n", sClient, WSAGetLastError(), INVALID_SOCKET, WSAEWOULDBLOCK);
	
	// 网络释放
    closesocket(sServer);   
    closesocket(sClient);   
    WSACleanup();   

	return 0;
}

      从程序的结果我们可以看到, accept函数的前面一句有打印, 后面一句没有打印, 可见, 程序阻塞的accept函数的。 因为, 对于阻塞形式的socket来讲, 如果没有客户端是connect, 程序就会一直阻塞在accept. 下面, 我们来看看非阻塞的socket, 程序如下:

 

 

#include <stdio.h>
#include <winsock2.h>   
#pragma comment(lib, "ws2_32.lib")   

int main()
{
	// 网络初始化
	WSADATA wsd;   
    WSAStartup(MAKEWORD(2,2), &wsd);


	// 默认为阻塞socket
    SOCKET sServer = socket(AF_INET,SOCK_STREAM, 0);    
   

	// 设置为非阻塞socket
	int iMode = 1;
	ioctlsocket(sServer, FIONBIO, (u_long FAR*)&iMode);


    // 设置服务器套接字地址   
    SOCKADDR_IN addrServ;   
    addrServ.sin_family = AF_INET;   
    addrServ.sin_port = htons(8888);
    addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    
    bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN));   
   

	// 用耳朵听听
    listen(sServer, 5);   
    

    // 接受客户请求 
	printf("accept\n");
    sockaddr_in addrClient;
    int len = sizeof(addrClient);   
	SOCKET sClient = accept(sServer,(sockaddr FAR*)&addrClient, &len);   
	printf("%d, %d, %d, %d\n", sClient, WSAGetLastError(), INVALID_SOCKET, WSAEWOULDBLOCK);
	

	// 网络释放
    closesocket(sServer);   
    closesocket(sClient);   
    WSACleanup();   

	return 0;
}

       结果为:

 

accept
-1, 10035, -1, 10035

      我们看到, 对于非阻塞的socket而言, accept函数立即返回了, 不阻塞了, 脾气不那么倔强了, 不死等了, 不痴心绝对了, 成熟了, 从容了。此时错误码是WSAEWOULDBLOCK,accept失败时产生这个错误码说明客户端没有去连接, 我们看看MSDN怎么说:

WSAEWOULDBLOCK

The socket is marked as nonblocking and no connections are present to be accepted.

MSDN相关网址:https://msdn.microsoft.com/en-us/library/ms737526(VS.85).aspx

 


本文转载:CSDN博客