• 4981阅读
  • 7回复

linux下如何在Qt中实时显示通信内容 [复制链接]

上一主题 下一主题
离线thornheart
 
只看楼主 倒序阅读 楼主  发表于: 2008-01-14
— 本帖被 XChinux 执行加亮操作(2008-01-14) —
这是我网络上找来的一段代码
能够和另一段内核中的代码通信

while循环中打印了通信的地址

现在我想把这些内容在我做的Qt界面里显示
请问怎么显示呢?
ps:我把这段代码用做Qt的main.cpp了


#include  <unistd.h>
#include  <stdio.h>
#include  <linux/types.h>
#include  <string.h>
#include  <sys/socket.h>
#include  <arpa/inet.h>
#include  <asm/types.h>
#include  <linux/netlink.h>
#include  <signal.h>
#include  "imp2.h"

struct  msg_to_kernel
{
    struct  nlmsghdr  hdr;
};

struct  u_packet_info
{
    struct  nlmsghdr  hdr;
    struct  packet_info  icmp_info;
};

static  int  skfd;

static  void  sig_int(int  signo)
{
    struct  sockaddr_nl  kpeer;
    struct  msg_to_kernel  message;

    memset(&kpeer,  0,  sizeof(kpeer));
    kpeer.nl_family  =  AF_NETLINK;
    kpeer.nl_pid        =  0;
    kpeer.nl_groups  =  0;

    memset(&message,  0,  sizeof(message));
    message.hdr.nlmsg_len  =  NLMSG_LENGTH(0);
    message.hdr.nlmsg_flags  =  0;
    message.hdr.nlmsg_type  =  IMP2_CLOSE;
    message.hdr.nlmsg_pid  =  getpid();

    sendto(skfd,  &message,  message.hdr.nlmsg_len,  0,  (struct  sockaddr  *)(&kpeer),
                  sizeof(kpeer));

    close(skfd);
    exit(0);
}

int  main(void)
{
    struct  sockaddr_nl  local;
    struct  sockaddr_nl  kpeer;
    int  kpeerlen;
    struct  msg_to_kernel  message;
    struct  u_packet_info  info;
    int  sendlen  =  0;
    int  rcvlen  =  0;
    struct  in_addr  addr;

    skfd  =  socket(PF_NETLINK,  SOCK_RAW,  NL_IMP2);
    if(skfd  <  0)
        {
            printf("can  not  create  a  netlink  socket\n");
            exit(0);
        }

    memset(&local,  0,  sizeof(local));
    local.nl_family  =  AF_NETLINK;
    local.nl_pid  =  getpid();
    local.nl_groups  =  0;
    if(bind(skfd,  (struct  sockaddr*)&local,  sizeof(local))  !=  0)
        {
            printf("bind()  error\n");
            return  -1;
        }

    signal(SIGINT,  sig_int);

    memset(&kpeer,  0,  sizeof(kpeer));
    kpeer.nl_family  =  AF_NETLINK;
    kpeer.nl_pid  =  0;
    kpeer.nl_groups  =  0;

    memset(&message,  0,  sizeof(message));
    message.hdr.nlmsg_len  =  NLMSG_LENGTH(0);
    message.hdr.nlmsg_flags  =  0;
    message.hdr.nlmsg_type  =  IMP2_U_PID;
    message.hdr.nlmsg_pid  =  local.nl_pid;

    sendto(skfd,  &message,  message.hdr.nlmsg_len,  0,
  (struct  sockaddr*)&kpeer,  sizeof(kpeer));

    while(1)
        {
            kpeerlen  =  sizeof(struct  sockaddr_nl);
            rcvlen  =  recvfrom(skfd,  &info,  sizeof(struct  u_packet_info),
0,  (struct  sockaddr*)&kpeer,  &kpeerlen);

            addr.s_addr  =  info.icmp_info.src;
            printf("src:  %s,  ",  inet_ntoa(addr));
            addr.s_addr  =  info.icmp_info.dest;
            printf("dest:  %s\n",  inet_ntoa(addr));
        }

    return  0;
}
[ 此贴被thornheart在2008-01-14 10:49重新编辑 ]
离线landuochong

只看该作者 1楼 发表于: 2008-01-14
创建一个mutilineedit,直接在上面显示不就可以了
离线thornheart
只看该作者 2楼 发表于: 2008-01-14

这些东西我都是刚学的,不是很明白
比如我创建了个listbox,在里面显示
listbox->insertItem(inet_ntoa(addr));
while循环外我最后运行exec是可以的,但它是统一显示的;

我想实时显示
离线XChinux

只看该作者 3楼 发表于: 2008-01-14
可以每次向list插入后调用QApplication::processEvents();
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线thornheart
只看该作者 4楼 发表于: 2008-01-14
恩,请版主兄弟帮忙看一下,我
int  main(void)
{
    QApplication a(argc,argv);
    Form1 w;
    w.show();
  ////
    while(1)
        {
            kpeerlen  =  sizeof(struct  sockaddr_nl);
            rcvlen  =  recvfrom(skfd,  &info,  sizeof(struct  u_packet_info), 0,  (struct  sockaddr*)&kpeer,  &kpeerlen);
            addr.s_addr  =  info.icmp_info.src;
            addr.s_addr  =  info.icmp_info.dest;
          //这是内核程序发过的内容,也是我想显示的
      w.listbox1->insertItem(inet_ntoa(addr))
           
                }
  a.exec();
    return  0;
}

这样显示能全,但不是实时的,
把a.exec();放while循环前又不显示,
不知道版主兄弟说的那个QApplication::processEvents();加在哪

thanks
离线thornheart
只看该作者 5楼 发表于: 2008-01-15
小顶一下
版主兄弟人呢
离线landuochong

只看该作者 6楼 发表于: 2008-01-15
a.processEvents();加在while之后,exec之前就应该可以
离线thornheart
只看该作者 7楼 发表于: 2008-01-15
可是那样的话,在做while循环的时候窗口是不显示呀
我就想while循环中接收到一条(recvfrom)就显示一条
快速回复
限100 字节
 
上一个 下一个