// SelectTestServer.cpp : 定义控制台应用程序的入口点。
//
// TCP UDP复用Server select非阻塞模式
// IP: 127.0.0.1
// TCP PORT: 5001
// UDP PORT: 5000
#include "stdafx.h"
#include <WINSOCK2.H>
#pragma comment ( lib, "ws2_32" )
#define LISTEN_IP "127.0.0.1"
#define LISTEN_TCP_PORT 5001 //TCP监听端口
#define LISTEN_UDP_PORT 5000 //UDP监听端口
#define DEFAULT_BUFF 256
#define MAX_LISTEN 5 //最多可同时连接的客户端数量
int g_fd_ArrayC[MAX_LISTEN] = {0}; //处理所有的待决连接
char recvBuff[DEFAULT_BUFF] = "\0";
char responseBuff[DEFAULT_BUFF] = "\0";
char noresponseBuff[DEFAULT_BUFF] = {"server connection is full"};
int g_nRes = 0;
int g_nConnNum = 0;//当前的客户端连接数
void ClientSocketAdd(fd_set FAR * set) //将服务器接收到的客户端socket添加到select监听中
{
for( int nLoopi=0; nLoopi<MAX_LISTEN; ++nLoopi )
{
if( g_fd_ArrayC[nLoopi] !=0 )
{
printf("-LOOPI: 待决SOCKET: %d\n",g_fd_ArrayC[nLoopi] );
FD_SET(g_fd_ArrayC[nLoopi], set );
}
}
}
void CheckActiveSocket(fd_set FAR * set) //轮询查看是否有select监听的socket有数据写入,并作出回应
{
printf("-查找可用的SOCKET\n");
for( int nLoopi=0; nLoopi<MAX_LISTEN; ++nLoopi )
{
if( FD_ISSET(g_fd_ArrayC[nLoopi], set) )
{
memset( recvBuff, 0 ,sizeof(recvBuff) );
g_nRes = recv( g_fd_ArrayC[nLoopi], recvBuff, sizeof(recvBuff)-1, 0 );
if( g_nRes <= 0 )
{
printf("-Client Has Closed.\n");
closesocket( g_fd_ArrayC[nLoopi] );
//将已经关闭的SOCKET从FD集中删除
FD_CLR( g_fd_ArrayC[nLoopi], set );
g_fd_ArrayC[nLoopi] = 0;
//g_fd_ResponseCount[nLoopi] = 0;//客户socket关闭,则不再重复回复信息
--g_nConnNum;
}
else
{
recvBuff[g_nRes] = '\0';
char* ptrStart;
char* ptrCurrent;
char tempbuffer[1000]="\0";
char noteId[5]="\0"; //节点ID
char result[3]="OK"; //返回结果
int messageLen=0;
int resultCount=5; //从接受到的报文中提取需要定时随机回复的次数
char s_messageLen[5]="\0";
printf("-Recvied: %s\n", recvBuff);
//
// TCP UDP复用Server select非阻塞模式
// IP: 127.0.0.1
// TCP PORT: 5001
// UDP PORT: 5000
#include "stdafx.h"
#include <WINSOCK2.H>
#pragma comment ( lib, "ws2_32" )
#define LISTEN_IP "127.0.0.1"
#define LISTEN_TCP_PORT 5001 //TCP监听端口
#define LISTEN_UDP_PORT 5000 //UDP监听端口
#define DEFAULT_BUFF 256
#define MAX_LISTEN 5 //最多可同时连接的客户端数量
int g_fd_ArrayC[MAX_LISTEN] = {0}; //处理所有的待决连接
char recvBuff[DEFAULT_BUFF] = "\0";
char responseBuff[DEFAULT_BUFF] = "\0";
char noresponseBuff[DEFAULT_BUFF] = {"server connection is full"};
int g_nRes = 0;
int g_nConnNum = 0;//当前的客户端连接数
void ClientSocketAdd(fd_set FAR * set) //将服务器接收到的客户端socket添加到select监听中
{
for( int nLoopi=0; nLoopi<MAX_LISTEN; ++nLoopi )
{
if( g_fd_ArrayC[nLoopi] !=0 )
{
printf("-LOOPI: 待决SOCKET: %d\n",g_fd_ArrayC[nLoopi] );
FD_SET(g_fd_ArrayC[nLoopi], set );
}
}
}
void CheckActiveSocket(fd_set FAR * set) //轮询查看是否有select监听的socket有数据写入,并作出回应
{
printf("-查找可用的SOCKET\n");
for( int nLoopi=0; nLoopi<MAX_LISTEN; ++nLoopi )
{
if( FD_ISSET(g_fd_ArrayC[nLoopi], set) )
{
memset( recvBuff, 0 ,sizeof(recvBuff) );
g_nRes = recv( g_fd_ArrayC[nLoopi], recvBuff, sizeof(recvBuff)-1, 0 );
if( g_nRes <= 0 )
{
printf("-Client Has Closed.\n");
closesocket( g_fd_ArrayC[nLoopi] );
//将已经关闭的SOCKET从FD集中删除
FD_CLR( g_fd_ArrayC[nLoopi], set );
g_fd_ArrayC[nLoopi] = 0;
//g_fd_ResponseCount[nLoopi] = 0;//客户socket关闭,则不再重复回复信息
--g_nConnNum;
}
else
{
recvBuff[g_nRes] = '\0';
char* ptrStart;
char* ptrCurrent;
char tempbuffer[1000]="\0";
char noteId[5]="\0"; //节点ID
char result[3]="OK"; //返回结果
int messageLen=0;
int resultCount=5; //从接受到的报文中提取需要定时随机回复的次数
char s_messageLen[5]="\0";
printf("-Recvied: %s\n", recvBuff);