初步感受一下非阻塞的socket

972 篇文章 329 订阅
147 篇文章 46 订阅

       我们先来看一个阻塞的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

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值