#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中显示 怎样才能接收一个 就显示一个呢?