用select模式实现TCP和UDP的混合监听

// 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);
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值