新学的,有错误请指出
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;
}
}
}