// Nonblocking.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
// listen port
u_short nListenPort = 5018;
// Initilize the listen socket
bool InitAndListen(SOCKET &sListen)
{
WSADATA wsaData;
int ret = WSAStartup(WINSOCK_VERSION,&wsaData);
if(ret != 0)
{
printf("WASStarup failed/n");
return false;
}
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_port = htons(nListenPort);
// Initial socket
sListen = socket(AF_INET,SOCK_STREAM,0);
if(sListen == INVALID_SOCKET)
{
printf("Initial socket failed/n");
return false;
}
// set socket nonblocking
u_long ul = 1;
if (ioctlsocket(sListen,FIONBIO,&ul) != 0)
{
printf("set socket failed/n");
return false;
}
// Bind socket
if(bind(sListen,(sockaddr*)&local,sizeof(local)) != 0)
{
printf("Bind socket failed/n");
return false;
}
// Listen socket
if(listen(sListen,64) != 0)
{
printf("Listen socket failed/n");
return false;
}
else
{
printf("Listen port %d/n",nListenPort);
}
return true;
}
int main(int argc, char* argv[])
{
if (argc == 2)
{
nListenPort = atoi(argv[1]);
}
SOCKET sListen;
if(!InitAndListen(sListen))
{
return 0;
}
printf("Server wait for client connect.../n");
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(sListen,&fdSocket);
while (true)
{
// echo buffer
char szBuf[16];
// assign the fdSocket to fdRead to select
fd_set fdRead = fdSocket;
int nRet = select(NULL,&fdRead,NULL,NULL,NULL);
if (nRet <= 0)
{
printf("select failed/n");
break;
}
for(int i=0;i<(int)fdSocket.fd_count;i++)
{
// check whether the socket is set
if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
{
// New connect come
if(fdSocket.fd_array[i] == sListen)
{
sockaddr_in remote;
int nAddrLen = sizeof(remote);
SOCKET sNew = ::accept(sListen,(sockaddr*)&remote,&nAddrLen);
FD_SET(sNew,&fdSocket);
// Put it to fdSocket sets
printf("Client %s:%d connected/n",
inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
}
else
{
char szBuffer[4096];
memset(szBuffer,0,sizeof(szBuffer));
int nRecv = recv(fdSocket.fd_array[i],szBuffer,sizeof(szBuffer),0);
if (nRecv > 0)
{
printf("Received Client Msg:%s/n",szBuffer);
::send(fdSocket.fd_array[i],szBuf,sizeof(szBuf),0);
}
else
{
// Close the socket and clear from the sets
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i],&fdSocket);
}
}
}
}
}
closesocket(sListen);
WSACleanup();
return 0;
}