Select模型
int select(
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);
第一个参数nfds,将会被系统忽略,包括这个参数只是为了和Berkeley Socket应用程序兼容.你将会注意到有三个fd_set结构的参数,一个用来检测可读,一个用来检测可写,第三个参数是带外数据(TCP紧急数据),timeout参数为超时时间
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
#include <Winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
#define InternetAddr "127.0.0.1"
#define iPort 1986
using namespace std;
int main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET fdServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(InternetAddr);
server.sin_port = htons(iPort);
int ret = bind(fdServer, (sockaddr*)&server, sizeof(server));
ret = listen(fdServer, 4);
SOCKET AcceptSocket;
fd_set fdread;
timeval tv;
int nSize;
while(1)
{
FD_ZERO(&fdread);//初始化fd_set
FD_SET(fdServer, &fdread);//分配套接字句柄到相应的fd_set
tv.tv_sec = 20;
tv.tv_usec = 0;
select(0, &fdread, NULL, NULL, &tv);
nSize = sizeof(server);
if (FD_ISSET(fdServer, &fdread))
{
AcceptSocket = accept(fdServer,( sockaddr*) &server, &nSize);
cout<<"采用Select模型,客户端开始连接"<<endl;
break;
}
else
{
cout<<"没有客户端连接,我可以做些别的事情"<<endl;
}
}
char buffer[128];
ZeroMemory(buffer, 128);
ret = recv(AcceptSocket,buffer,128,0);
cout<<buffer<<endl;
closesocket(AcceptSocket);
WSACleanup();
return 0;
}