• 4918阅读
  • 2回复

qt 显示问题 哪位帮我看看 这个程序的结构 怎样修改呢 [复制链接]

上一主题 下一主题
离线zhanglele
 
只看楼主 倒序阅读 楼主  发表于: 2008-07-06
— 本帖被 XChinux 执行加亮操作(2008-07-06) —
#include <qapplication.h>
#include "client.h"
#include <qdialog.h>
#include <qtextedit.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
class QTextEdit;
int main(int argc, char *argv[])
{       
    QApplication app(argc, argv);
        Client dialog;
    QTextEdit* textEdit1;
    textEdit1 = new QTextEdit( &dialog, "textEdit1" );
    textEdit1->setReadOnly(true);
    textEdit1->setGeometry( QRect( 110, 50, 390, 124 ) );
    app.setMainWidget(&dialog);
      dialog.show();

/*下面是组播接收数据的代码:*/
   
    int port = 6789;
    struct ip_mreq command;
    int loop = 1;
    int iter = 0;
    int sin_len;
    char message[256];
    int socket_descriptor;
    struct sockaddr_in sin;
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(port);
    if((socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
    loop = 1;
    if(setsockopt(socket_descriptor,SOL_SOCKET, SO_REUSEADDR,&loop, sizeof(loop))< 0)
    {
        perror("setsockopt:SO_REUSEADDR");
        exit(EXIT_FAILURE);
    }
    if(bind(socket_descriptor,(struct sockaddr *)&sin, sizeof(sin)) < 0)
    {
        perror("bind");
        exit(EXIT_FAILURE);
    }
    loop = 1;
    if(setsockopt(socket_descriptor,IPPROTO_IP, IP_MULTICAST_IF, &sin, sizeof(sin)) < 0)
    {
        perror("setsockopt:IP_MULTICAST_LOOP");
        exit(EXIT_FAILURE);
    }
    command.imr_multiaddr.s_addr = inet_addr("224.0.0.233");
    command.imr_interface.s_addr = htonl(INADDR_ANY);
    if(command.imr_multiaddr.s_addr == -1)   
    {
        perror("224.0.0.1 not a legal multicast address");
        exit(EXIT_FAILURE);   
    }
    if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(command)) < 0)
    {
        perror("setsockopt:IP_ADD_MEMBERSHIP");
      }

/*接收8个数据包*/
    while(iter++ < 8)
    {
        sin_len = sizeof(sin);
    if(recvfrom(socket_descriptor, message, 256, 0,(struct sockaddr *)&sin,(socklen_t *)&sin_len) == -1)
    {
        perror("recvfrom");
    }
    textEdit1->append(QString("Response from server: %1").arg(message));
     }
    if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP, &command, sizeof(command)) < 0)
    {
        perror("setsockopt:IP_DROP_MEMBERSHIP");
    }
    close(socket_descriptor);
    return app.exec();
}

现在的问题是:
必须接收完8个数据包 才能弹出对话框在qt中显示 怎样才能接收一个 就显示一个呢?
离线linshihaoma

只看该作者 1楼 发表于: 2008-07-06
qt封装了socket,你为什么非得用系统调用呢?
离线zhanglele
只看该作者 2楼 发表于: 2008-07-06
我用的qt3。1 而且要实现组播 它里面没有相关的类哦
快速回复
限100 字节
 
上一个 下一个