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;

}

SIp Socket,布布扣,bubuko.com

时间: 2024-10-29 05:13:46

SIp Socket的相关文章

libeXosip2(2-1) -- eXosip2 configuration API

eXosip2 configuration API General purpose API. Data Structures struct   eXosip_dns_cache struct   eXosip_tls_credentials_s struct   eXosip_tls_ctx_s Macros #define  EXOSIP_OPT_UDP_KEEP_ALIVE   (EXOSIP_OPT_BASE_OPTION+1) #define  EXOSIP_OPT_UDP_LEARN_

基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三种协议来实现VoIP,同时可以与目前电话使用的标准硬件进行交互通信,Asterisk在实现VoIP时,不需要任何附加硬件,本文所采用的也是这种使用方式.但是,如果企业没有与VoIP语音网关运营商建立合作关系,想要自己构建这样的一个平台,那么要和数字电话设备与模拟电话设备进行交互通信,Asterisk

socket,tcp,http三者之间的区别和原理

http.TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP.SSH.NFS.RTSP.XMPP.Whois.ENRP 6 表示层 例如XDR.ASN.1.SMB.AFP.NCP 5 会话层 例如ASAP.TLS.SSH.ISO 8327 / CCITT X.225.RPC.NetBIOS.ASP.Winsock.BSD sockets 4 传输层 例如TC

TCP/IP、Http、Socket、XMPP-从入门到深入

TCP/IP.Http.Socket.XMPP-从入门到深入 终极iOS程序猿 2016-12-29 18:27 为了便于大家理解和记忆,我们先对这几个概念进行的介绍,然后分析他们的不同,再进行详细的分析. 一.TCP/IP简介 IP协议是网络层,TCP协议是传输层,HTTP协议是应用层,socket是对TCP/IP协议的代码封装和应用. TPC/IP 主要解决数据如何在网络中传输,HTTP主要解决如何包装数据. TCP/IP协议用来传输数据,应用层协议 使传输的数据有意义,应用层协议有很多,比

Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider

I. 概述 在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroid实现的SIP协议栈中扮演底层枢纽的角色(前一篇文章中介绍的SipdroidEngine扮演的是上层枢纽), 这一角色也可以从该类是Configurable, TransportListener, TcpServerListener的继承体现出来. 向下层, SipProvider和通信传输层进行交互, 包括接收Transport的回调, 向Transport传递要发送的msg 向

MFC Socket

目 录 第1章 同步TCP通讯    1 1.1 同步通讯与异步通讯    1 1.2 同步通讯类    1 1.3 同步TCP通讯客户端    4 1.3.1 界面    4 1.3.2 界面类声明    4 1.3.3 界面类构造函数    5 1.3.4 连接服务器    5 1.3.5 写数据    6 1.3.6 读数据    6 1.3.7 断开连接    7 1.4 同步TCP通讯服务端    7 1.4.1 界面    7 1.4.2 界面类声明    8 1.4.3 CSock

VC++6.0网络编程Socket编程(转)

从csdn上下载的该软件的教程: 作为一个初学者,深感Socket编程入门的困难,但当把一些问题弄懂之后,回过头来看以前遇到的一些问题,才发现 Socket编程其实并没有那么复杂.接下来我就把我遇到的一些困难讲述下,并补上解决的办法. 首先我们要想实现一个简单的点对点网络通信,就应该有一个客户和一个服务器 我们先来做客户端.先按照如下图所示建立好客户对话框模块: 首先创建一个基于MFC AppWizard[EXE] 工程,工程名为Socket__002 (这里是以我的工程名为准,你们也可以自己命

基于SIP和RTP协议的开源VOIP之QuteCom简介

*************************************************************************************************************************** 作者:EasyWave                                                                              时间:2014.10.30 类别:Linux应用-基于oSIP协议的开源V

介绍一个开源的SIP(VOIP)协议库PJSIP

本文系转载,出处不可考. 如果你对SIP/VoIP技术感兴趣,哪希望你不要错过:),如果你对写出堪称优美的Code感兴趣 ,那么你也不可错过:) 这期间我想分析一下一个实际的协议栈的设计到实现的相关技术,算是自己的一个学习经 历记录. 最初选择这个库做分析的原因很简单,文档齐全:),其它良好的特征则是慢慢发现的:) www.pjsip.org 1. PJSIP简介 PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括: 1).极具移植性.(Extremely porta