转载自 http://david4383.lofter.com/post/1cbffe05_39cfee1
最近使用linphone,linphone是使用C编写的,他写的linphonec可以比较简单的实现通讯,因此想在这个基础上做些修改,应用到项目中去,最紧要的就是如何让纯C的LINPHONE与QT通讯,QT是C++的这个,因此C与C++的数据交换还是有些问题的,最终采用SOCKET通讯,很好很快的实现了功能。
主要代码如下:
纯C中,
void initsocket()
{
int len;
struct sockaddr_in address;
int result;
int i;
struct sockaddr_un sa;
char *servername="/tmp/AAA";
if((sockfd = socket(AF_UNIX,SOCK_STREAM,0))==-1)
{
perror("socket error");
exit(EXIT_FAILURE);
}
sa.sun_family=AF_UNIX;
strncpy(sa.sun_path,servername,sizeof(sa.sun_path)-1);
if((result = connect(sockfd,(struct sockaddr *)&sa,sizeof(sa)))==-1)
{
perror("connect error");
exit(EXIT_FAILURE);
}
char *abc="abcdefg!";
printf ("socket is sendab.\n");
socketsend(abc);
printf ("socket is sendbb.\n");
}
int socketsend(char *dat)
{
// int byte;
// if((byte=send(sockfd,dat,100,0))==-1)
// {
// return 0;
// }
// return 1;
write(sockfd,dat,100);
}
先使用initsocket进行初始化,然后在需要的地方调用socketsend,或者直接wirte也可以。
在QT中使用QLocalServer来进行通讯就比较方便了,代码如下
先在头文件中定义:
public:
QLocalServer *m_pServer;
QLocalSocket *m_pSocket;
private slots:
void newConnectionSlot();
void dataReceived();
初始化函数中实现初始化。
m_pServer=new QLocalServer(this);
connect(m_pServer,SIGNAL(newConnection()),this,SLOT(newConnectionSlot()));
if(m_pServer->listen("AAA"))
{
qDebug()<<"Open Server is succeed";
}
else
{
qDebug()<<"Open Server is failed";
}
以上部分是初始化。
以下部分是实现两个槽函数。
void Widget::newConnectionSlot()
{
qDebug()<<"Have a Socket Connect server";
m_pSocket=m_pServer->nextPendingConnection();
connect(m_pSocket,SIGNAL(disconnected()),m_pSocket,SLOT(deleteLater()));
connect(m_pSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
}
void Widget::dataReceived()
{
while(m_pSocket->bytesAvailable())
{
QString vTemp;
vTemp=m_pSocket->readLine();
qDebug()<<"The receive data is:"<<vTemp;
}
}