void AppMain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int PortNo = 12345;
SOCKET ListenSock;
int Ret = 0;
WSAData wsa;
if ((Ret = WSAStartup(MAKEWORD(2,0), &wsa)) != 0)
{
printf("WSAStartup() fail.");
WSACleanup();
return;
}
if ((ListenSock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("socket() fail.");
closesocket(ListenSock);
WSACleanup();
return;
}
SOCKADDR_IN local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(PortNo);
if ((bind(ListenSock, (struct sockaddr *)&local, sizeof(local)) != 0))
{
printf("bind() fail.");
closesocket(ListenSock);
WSACleanup();
return;
}
if (listen(ListenSock, 10) != 0)
{
printf("listen() fail.");
closesocket(ListenSock);
WSACleanup();
return;
}
timeval timeout;
timeout.tv_sec = 30;
timeout.tv_usec = 0;
SOCKET ClientList[FD_SETSIZE];
SOCKET ClientSock;
int nCurrClient = 0;
for(int i = 0; i < FD_SETSIZE; ++i)
ClientList[i] = INVALID_SOCKET;
int nSelect = 0;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(ListenSock, &readfds);
while(true)
{
nSelect = select(0, &readfds, NULL, NULL, &timeout);
if (FD_ISSET(ListenSock, &readfds))
{
ClientSock = accept(ListenSock, NULL, NULL);
//add to client list
for(int i = 0; i < FD_SETSIZE; ++i)
{
if (INVALID_SOCKET == ClientList[i])
{
ClientList[i] = ClientSock;
break;
}
}
if (FD_SETSIZE == i) //list full
{
closesocket(ClientSock);
continue;
}
}
for(int i = 0; i < FD_SETSIZE; ++i)
{
char buf[1024] = {0};
if (FD_ISSET(ClientList[i], &readfds))
{
int nRet = recv(ClientList[i], buf, sizeof(buf), 0);
if (nRet == 0 || nRet == INVALID_SOCKET)
{
closesocket(ClientList[i]);
ClientList[i] = INVALID_SOCKET;
continue;
}
printf("recv: %s/n", buf);
send(ClientList[i], buf, sizeof(buf), 0);
}
}
FD_ZERO(&readfds);
FD_SET(ListenSock, &readfds);
for(int i = 0; i < FD_SETSIZE; ++i)
{
if(ClientList[i] != INVALID_SOCKET)
FD_SET(ClientList[i], &readfds);
}
}
}