brew 下建立多个套接字监听

/*
*应用客户端定义
*/
typedef struct _ClientInfo
{
int id;//编号
uint32 clsid;//应用小程序ID
uint32 svrip;//对应服务端IP
int sport;//对应服务端端口
int lport;//本地监听端口
int state;//当前状态,未使用返回0 已经使用返回1
int tunid;//应用虚拟通道ID,默认为0表示未创建,如果创建则为 id的值
int recenttime;//最近活动时间
ISocket *ListenSocket;//监听SOCKET
int islisten;//是否已经监听
ISocket *AcceptSocket;//接收数据SOCKET
int isaccept;//是否已经接受连接
char *sendbuf;//要发送的数据缓冲区
char *recbuf;//接收到的数据缓冲区
int sendlen;//要发送的数据长度
int sendcurlen;//已经发送的数据长度,在循环发送时使用
int reclen;//接收到的数据长度
} ClientInfo;

 

 

//下面是建立监听的代码

 

#include "AppDataRS.h"
/*
*初始化本地监听
*
*/
void ListenerSocket_Ini( SafeClient *pMe)
{
DBGPRINTF("ini listener socket");
if (pMe->cinfo==NULL || pMe->cinfo_count<=0)
{
return ;
}
else
{
int okcount=0;
int i=0;
for (;i<pMe->cinfo_count;i++)
{
((ClientInfo *)(pMe->cinfo+i))->ListenSocket=INETMGR_OpenSocket(pMe->pnetmgr,AEE_SOCK_STREAM);
if (((ClientInfo *)(pMe->cinfo+i))->ListenSocket==NULL)
{
((ClientInfo *)(pMe->cinfo+i))->state=-1;
}
else
{
okcount+=1;
}
}
if (okcount>0)//表示至少有一个应用通道的监听SOKCET已经创建成功
{
DBGPRINTF("ini listener ok!");
ListenerSocket_Bind(pMe);
}
else
{
return;
}
}
}
/*
*绑定本地监听端口
*/
static void ListenerSocket_Bind(SafeClient *pMe)
{
int i=0;
int res;
for (;i<pMe->cinfo_count;i++)
{
if (((ClientInfo *)(pMe->cinfo+i))->ListenSocket->pvt==NULL)
{
return;
}
if (((ClientInfo *)(pMe->cinfo+i))->lport==NULL)
{
break;
}
res=ISOCKET_Bind(((ClientInfo *)(pMe->cinfo+i))->ListenSocket,AEE_INADDR_ANY,NTOHS(((ClientInfo *)(pMe->cinfo+i))->lport));
switch (res)
{
case AEE_NET_ERROR:
break;
case AEE_NET_WOULDBLOCK:
ISOCKET_Writeable(((ClientInfo *)(pMe->cinfo+i))->ListenSocket,(PFNNOTIFY)ListenerSocket_Bind,pMe);
return;
case AEE_NET_SUCCESS:
DBGPRINTF("%d local port Bind OK",((ClientInfo *)(pMe->cinfo+i))->lport);
ListenerSocket_Listen(pMe);
continue;
}
}
}
/*
*启动监听端口
*/
static void ListenerSocket_Listen(SafeClient *pMe)
{
int i=0;
ClientInfo *pcinfo=NULL;
for (;i<pMe->cinfo_count;i++)
{
int res;
pcinfo=((ClientInfo *)(pMe->cinfo+i));
if (pcinfo->islisten==1)//已经监听
{
continue;
}
res=ISOCKET_Listen(pcinfo->ListenSocket,1);
switch (res)
{
case AEE_NET_ERROR:
break;
case AEE_NET_WOULDBLOCK:
ISOCKET_Writeable(pcinfo->ListenSocket,(PFNNOTIFY)ListenerSocket_Listen,pMe);
return;
case AEE_NET_SUCCESS:
DBGPRINTF("%d local port Listen OK",pcinfo->lport);
pcinfo->islisten=1;
ListenerSocket_Accept(pMe);
continue;
}
}
pcinfo=NULL;
}
/*
*指定监听端口的数据收发接口
*/
static void ListenerSocket_Accept(SafeClient *pMe)
{
int i=0;
int res;
ClientInfo *pcinfo=NULL;
for (;i<pMe->cinfo_count;i++)
{
pcinfo=((ClientInfo *)(pMe->cinfo+i));
if (pcinfo->isaccept==1)//已经连接
{
pcinfo=NULL;
continue;
}
res=ISOCKET_Accept(pcinfo->ListenSocket,(ISocket **)&(pcinfo->AcceptSocket));
if (res==AEE_NET_WOULDBLOCK)
{
DBGPRINTF("waiting a local connect!" );
ISOCKET_Readable(pcinfo->ListenSocket,(PFNNOTIFY)ListenerSocket_Accept,pMe);
pcinfo=NULL;
return;
}
if (res==AEE_NET_ERROR)
{
char * errmsg=MALLOC(100);
SPRINTF(errmsg,"%d port accept error!code:%x",pcinfo->lport,ISOCKET_GetLastError(pcinfo->ListenSocket));
DBGPRINTF(errmsg);
WriteLog(pMe,errmsg,0);
FREEIF(errmsg);
break;
}
if (res==AEE_SUCCESS)
{
pcinfo->state=1;//置当前客户端连接为可用连接
pcinfo->isaccept=1;
//发送创建安全网关与应用服务端连接请求
CreateTunnel(pMe,pcinfo->tunid,pcinfo->svrip,pcinfo->sport);
DBGPRINTF("%d port is accepting..",pcinfo->lport);
RecAppData(pMe);
}
}
ISOCKET_Readable(pcinfo->ListenSocket,(PFNNOTIFY)ListenerSocket_Accept,pMe);
pcinfo=NULL;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值