纯C与QT通过socket通信

来源:互联网 发布:阿里云学生认证 高中生 编辑:程序博客网 时间:2024/06/05 10:59

转载自 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;

    }

}


0 0