您的位置:首页 > 其它

WinSock学习(1):Select模型

2012-02-16 10:33 501 查看
新学的,有错误请指出

bool InitialSocket(SOCKET sock,u_short port);
int FindPosOfSet(SOCKET s,fd_set * set);

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);

SOCKET sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(!InitialSocket(sListen,25418))
{
printf("Socket initial Error!\n");
return -1;
}

fd_set fdset;
FD_ZERO(&fdset);
FD_SET(sListen,&fdset);

int nRet=0;
char buf[100];
ZeroMemory(buf,sizeof(buf));

printf("waiting for new connection!\n");

while(true)
{

fd_set fdread=fdset;
//fd_set fdwrite=fdset;

nRet=select(NULL,&fdread,NULL,NULL,NULL);

if(nRet>0)
{
//循环遍历每个在fdread中的SOCKET
for(unsigned int i=0;i<fdread.fd_count;++i)
{
if(fdread.fd_array[i]==sListen)
{
//有客户端接入
SOCKADDR_IN newAddr;
int len=sizeof(SOCKADDR);
SOCKET newSocket=accept(sListen,(SOCKADDR*)&newAddr,&len);
if(newSocket==INVALID_SOCKET)
{
printf("INVALID SOCKET|Error code:%d\n",WSAGetLastError());
goto CLEAN;
}
//将接入的SOCKET放入SET
FD_SET(newSocket,&fdset);
printf("add new connection:%s\nnow %d client(s) online\n",inet_ntoa(newAddr.sin_addr),fdset.fd_count-1);
}
else
{
//有数据可读

//判断SOCKET是否断开
ZeroMemory(buf,sizeof(buf));

if(recv(fdread.fd_array[i],buf,100,0)==0)
{
printf("Client disconnect!\n");
//将断开SOCKET从SET中删除
FD_CLR(fdread.fd_array[i],&fdset);
continue;
}
printf("recving data from %d :%s\n",FindPosOfSet(fdread.fd_array[i],&fdset),buf);
}
}
}
else
{
printf("nret==0!\n");
}
}
closesocket(sListen);
WSACleanup();
return 0;

CLEAN:	{
closesocket(sListen);
WSACleanup();
return -1;
}
}

bool InitialSocket(SOCKET sock,u_short port)
{
// 	WSADATA wsaData;
// 	WSAStartup(MAKEWORD(2,2),&wsaData);

SOCKADDR_IN serverAddr;
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(port);
serverAddr.sin_addr.s_addr=htonl(ADDR_ANY);

if(bind(sock,PSOCKADDR(&serverAddr),sizeof(serverAddr)))
{
printf("bind error!error code:%d\n",WSAGetLastError());
WSACleanup();
return false;
}

if(listen(sock,5))
{
printf("listen error!error code:%d\n",WSAGetLastError());
WSACleanup();
return false;
}

return true;
}

int FindPosOfSet(SOCKET s,fd_set * set)
{
for(int i=0;i<set->fd_count;++i)
{
if(s==set->fd_array[i])
{
return i;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: