java socket ami,SIp Socket

UINT AMILinkThread(LPARAM lparam)

{

CCallSchedulingSystemDlg *Dlg = (CCallSchedulingSystemDlg *)lparam;

//大循环,出现网络连接断开或点击设置中的应用后,会重新连接服务器,并生成新的socket

while(Dlg->AMIlinking)

{

closesocket(Dlg->AMIsock);

//连接server

Dlg->AMIsock=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr(Dlg->m_strServer.GetString());

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(5038);

int error=-1, len;

len = sizeof(int);

timeval tm;

fd_set set;

unsigned long ul = 1;

ioctlsocket(Dlg->AMIsock, FIONBIO, &ul);  //设置为非阻塞模式

bool ret = false;

int iRet = connect(Dlg->AMIsock, (struct sockaddr *)&addrSrv, sizeof(addrSrv));

if( iRet == -1)

{

tm.tv_sec  = 8;  //超时时间8秒

tm.tv_usec = 0;

FD_ZERO(&set);

FD_SET(Dlg->AMIsock, &set);

if( select(Dlg->AMIsock+1, NULL, &set, NULL, &tm) > 0)

{

char bb[128] = {0};

int iRet = getsockopt(Dlg->AMIsock, SOL_SOCKET, SO_ERROR, bb, (socklen_t *)&len);

if(iRet == 0)

ret = true;

else

ret = false;

}

else

{

ret = false;

}

}

else

{

ret = true;

}

//ul = 0;

//ioctlsocket(Dlg->AMIsock, FIONBIO, &ul); //设置为阻塞模式

if(!ret)

{

//连接失败

//closesocket(Dlg->AMIsock);

continue; //重新连接

}

memset(Dlg->lastbuff, 0 , sizeof(Dlg->lastbuff));

mysql_close(&(Dlg->mysql));

if(!mysql_real_connect(&(Dlg->mysql), Dlg->m_strServer.GetString(),"operator","123456",NULL,3306,NULL,0)) //mydb为你所创建的数据库,3306为端口号,可自行设定

{

//AfxMessageBox("数据库连接失败");

Dlg->isConnectd = FALSE;

continue;

}

else

{

Dlg->isConnectd = TRUE;

if(!mysql_real_connect(&(Dlg->myAlarmSql),Dlg->m_strServer,"operator","123456",NULL,3306,NULL,0))

{

Dlg->isConnectd = FALSE;

continue;

}

}

Dlg->canUsersInit = 1;

//socket缓存

char lastbuff[BUFFERSIZE] = {0};

char buff[BUFFERSIZE] = {0};

len = 0;

//接收数据

fd_set rset;

int nReady;

struct timeval timeout;

while(Dlg->AMIlinking)

{

FD_ZERO(&rset);

timeout.tv_sec = 0;

timeout.tv_usec = 200;

//listen socket 加入fdset

FD_SET(Dlg->AMIsock, &rset);

nReady = select(Dlg->AMIsock+1, &rset, NULL, NULL, &timeout);

if(nReady == 0) //超时

{

continue;

}

else if(nReady == -1)  //出错

{

//closesocket(Dlg->AMIsock);

Dlg->isConnectd = FALSE;

break;

}

else if( FD_ISSET(Dlg->AMIsock,&rset))

{

Dlg->canGetMessagedata = 1;

//Dlg->GetMessagedata();

/*int result = recv(Dlg->AMIsock,buff+len,BUFFERSIZE-len-1,0);

//如果网络连接断开

if(SOCKET_ERROR == result)

{

//AfxMessageBox("SOCKET连接出错");

break;

}

else if(result > 0)

{

CString str;

if(strstr(buff,"Asterisk Call Manager"))

{

str = "Action: login\r\nUsername: phpagi\r\nSecret: phpagi\r\n\r\n";

send(Dlg->AMIsock,str.GetBuffer(0),str.GetLength(),0);

continue;

}

else if(strstr(buff, "Authentication accepted"))

{

//str = "Action: sippeers\r\n\r\naction: DAHDIShowChannels\r\n\r\naction: CoreShowChannels\r\n\r\nAction: MeetmeList\r\nConference: "+m_strUser+"\r\n\r\n";

str = "Action: sippeers\r\n\r\naction: DAHDIShowChannels\r\n\r\naction: CoreShowChannels\r\n\r\nAction: MeetmeList\r\n\r\n";

send(Dlg->AMIsock,str.GetBuffer(0),str.GetLength(),0);

continue;

}

//处理

char *head = buff;

char *pStr = NULL;

//处理head指向的内存的过程

while((pStr = strstr(head, "\r\n\r\n")))

{

*(pStr+2) = '\0';

Dlg->StrToEvent(head);

Dlg->EventProcess();

head = pStr + 4;

if(*head == '\0')

break;

}

memset(lastbuff,0,BUFFERSIZE);

len = strlen(head);

if(*head != '\0')

{

memcpy(lastbuff, head, len);

}

}*/

}

}

//连接断开

//closesocket(Dlg->AMIsock);

Dlg->isConnectd = FALSE;

}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值