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