⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatform.cpp

📁 linux下的socket通信和c++
💻 CPP
字号:
/****************************************************************************** Form implementation generated from reading ui file 'chatform.ui'**** Created by: The User Interface Compiler ($Id: qt/main.cpp   3.3.8   edited Jan 11 14:47 $)**** WARNING! All changes made in this file will be lost!****************************************************************************/#include "chatform.h"#include <qvariant.h>#include <qlabel.h>#include <qpushbutton.h>#include <qtextedit.h>#include <qcombobox.h>#include <qlayout.h>#include <qtooltip.h>#include <qwhatsthis.h>#include <qimage.h>#include <qpixmap.h>#define REMOTE_PORT 6789#define LOCAL_PORT  9875typedef struct user{	char id[15];	char ip[16];}Friend;Friend friends[4];int num=-1;/* *  Constructs a chatForm as a child of 'parent', with the *  name 'name' and widget flags set to 'f'. * *  The dialog will by default be modeless, unless you set 'modal' to *  TRUE to construct a modal dialog. */chatForm::chatForm( Socket &s,QWidget* parent, const char* name, bool modal, WFlags fl )    : QDialog( parent, name, modal, fl ),sock(s){    if ( !name )	setName( "chatForm" );    tlable = new QLabel( this, "tlable" );    tlable->setGeometry( QRect( 20, 230, 60, 31 ) );    sendBtn = new QPushButton( this, "sendBtn" );    sendBtn->setGeometry( QRect( 230, 371, 60, 30 ) );    closeBtn = new QPushButton( this, "closeBtn" );    closeBtn->setGeometry( QRect( 330, 370, 61, 31 ) );    chatTxt = new QTextEdit( this, "chatTxt" );    chatTxt->setGeometry( QRect( 10, 10, 391, 210 ) );    chatTxt->setVScrollBarMode( QTextEdit::AlwaysOn );    chatTxt->setHScrollBarMode( QTextEdit::AlwaysOff );    editTxt = new QTextEdit( this, "editTxt" );    editTxt->setGeometry( QRect( 10, 270, 391, 90 ) );    editTxt->setHScrollBarMode( QTextEdit::AlwaysOff );    userlist = new QComboBox( FALSE, this, "userlist" );    userlist->setGeometry( QRect( 80, 230, 131, 31 ) );    languageChange();    resize( QSize(418, 402).expandedTo(minimumSizeHint()) );    clearWState( WState_Polished );        isChat=false;	 isToQuit=false;	 isQuited=false;	     // signals and slots connections    //connect( closeBtn, SIGNAL( clicked() ), this, SLOT( close() ) );    connect( closeBtn, SIGNAL( clicked() ), this, SLOT( ToClose() ) );    connect( closeBtn, SIGNAL( clicked() ), chatTxt, SLOT( clear() ) );    connect( this, SIGNAL( IsQuit() ), this, SLOT( close() ) );    connect( sendBtn, SIGNAL( clicked() ), this, SLOT( ChatTo()));    connect(this,SIGNAL(toGetUserList()),this,SLOT(GetUserList()));    connect(this,SIGNAL(toChat()),this,SLOT(Chat()));        connect( sendBtn, SIGNAL( clicked() ), editTxt, SLOT( clear() ) );       connect( sendBtn, SIGNAL( clicked() ), editTxt, SLOT( setFocus() ) );   }/* *  Destroys the object and frees any allocated resources */chatForm::~chatForm(){    // no need to delete child widgets, Qt does it all for us}/* *  Sets the strings of the subwidgets using the current *  language. */void chatForm::languageChange(){    tlable->setText( tr( "Send To->" ) );    sendBtn->setText( tr( "Send" ) );    closeBtn->setText( tr( "Close" ) );    userlist->clear();}bool chatForm::Show(){  show();  emit  	toGetUserList();  return true;  }void chatForm::GetUserList(){	char msg[15];	strcpy(msg,sock.GetMsg());	//msg[strlen(msg)]='\0';	cout<<msg<<endl;	if(strncmp(msg,"one",3))	{		while(strncmp(msg,"end",3))		{			userlist->insertItem(msg);			num++;			strcpy(friends[num].id,msg);			strcpy(msg,sock.GetMsg());			strcpy(friends[num].ip,msg);			cout<<msg<<endl;			strcpy(msg,sock.GetMsg());		}	}	this->start();}void chatForm::run(){   sleep(1);   int ret;   sd=socket(AF_INET,SOCK_DGRAM,0);         if(sd<0)   	_exit(1);   fcntl(sd,F_SETFL,O_NONBLOCK);	   myaddr.sin_family=AF_INET;   myaddr.sin_addr.s_addr=htonl(INADDR_ANY);   myaddr.sin_port=htons(LOCAL_PORT);      ret=bind(sd,(struct sockaddr*) &myaddr,sizeof(myaddr));   if(ret<0)   {   	cout<<"Cann't bind port!"<<endl;   	_exit(1);   }  	Chat();}void chatForm::UpdateUserList(){	char msg[15];	strcpy(msg,sock.GetMsg());	userlist->insertItem(msg);	num++;	strcpy(friends[num].id,msg);		strcpy(msg,sock.GetMsg());	strcpy(friends[num].ip,msg);}void chatForm::Chat(){	fd_set rfd,wfd,efd;	int ret;	int sockfd=sock.GetSockfd();	int maxfd=(sd>sockfd? sd: sockfd);	struct sockaddr_in remoteaddr;	char msg[256];	struct timeval tv;	tv.tv_sec=2;	tv.tv_usec=400000;	while(!isToQuit)	{		FD_ZERO(&rfd);		FD_ZERO(&wfd);		FD_ZERO(&efd);		FD_SET(sockfd,&rfd);		//FD_SET(sockfd,&efd);		FD_SET(sd,&rfd);		//FD_SET(sd,&efd);	  if((ret=select(maxfd+1,&rfd,&wfd,&efd,&tv))<0)	  		return;	  if(FD_ISSET(sockfd,&rfd))	  {	  	 UpdateUserList();	  }	  	  if(FD_ISSET(sd,&rfd))	  {	 	  	 cout<<"Get  Msg"<<endl;   	    int len=sizeof(remoteaddr);	  	 int n=recvfrom(sd,msg,256,0,(struct sockaddr*)&remoteaddr,(socklen_t *)&len);	  	 msg[strlen(msg)]='\0';	  	  	 for(int i=0;i<=num;i++)	  	 {	  	 	if(strcmp(friends[i].ip,inet_ntoa(remoteaddr.sin_addr)))	  	 		continue;	  	 	chatTxt->append(strcat(strcat(friends[i].id,":\n"),msg));	  	 	break;	  	 }	  	 cout<<"chating...."<<endl;	  }	  sleep(1);	}	sock.CloseSocket();	this->wait();}void chatForm::ChatTo(){	int n=userlist->currentItem ();		int rc,i;	struct sockaddr_in remoteaddr;	struct hostent *h;		h=gethostbyname(friends[n].ip);		if(h==NULL)		QMessageBox::information( this, "IP",       "Cann't link to the addr!\n");          cout<<"Chat with"<<inet_ntoa(*(struct in_addr*)h->h_addr_list[0])<<endl;   remoteaddr.sin_family=h->h_addrtype;   memcpy((char*)&remoteaddr.sin_addr.s_addr,h->h_addr_list[0],h->h_length);   remoteaddr.sin_port=htons(REMOTE_PORT);        rc=sendto(sd,editTxt->text(),strlen(editTxt->text())+1,0,(struct sockaddr*) &remoteaddr,sizeof(remoteaddr));   if(rc>=0)     chatTxt->append(userlist->currentText()+":\n"+editTxt->text());}void chatForm::ToClose(){	isToQuit=true;	emit		IsQuit();	isQuited=true;}bool chatForm::IsQuited(){	return isToQuit;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -