怎麼在qt中使用connect指令來寫socket
阿新 • • 發佈:2019-02-08
如何在qt中使用connect指令來寫socket?
如何在qt中使用connect指令來寫socket?
我想用connect指令來設計socket
但是 qt 自動把 connect 當成傳遞訊號了 也就是qobject裡面的connect了
請問我怎樣才能用 connect 連結伺服器呢?
------解決方案--------------------
如何在qt中使用connect指令來寫socket?
我想用connect指令來設計socket
但是 qt 自動把 connect 當成傳遞訊號了 也就是qobject裡面的connect了
請問我怎樣才能用 connect 連結伺服器呢?
------解決方案--------------------
/*server.h 就是server的標頭檔案*/ #ifndef SERVER_H #define SERVER_H #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netdb.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/select.h> #include <unistd.h> #include <arpa/inet.h> #include <qstring.h> #include <qapplication.h> #include <qthread.h> #include <qsignal.h> #include <qobject.h> #include <qvariant.h> #include <qdialog.h> #include <qwidget.h> #include "userevent.h" #include "VPN_usr.h" //# define RECVBUF 140 //# define BACKLOG 10 typedef struct data { char command[20]; char parm[20]; char context[100]; }Data; class server : public QThread { public: int new_fd; unsigned char from_client[140]; UserEvent *usre; QString str; QObject test; void set_target(QWidget *parent); server(); ~server(); void run(); void stop(); void VPN_encrypt_send(); void VPN_certification_send(); private: Data pData; volatile bool stopped; QWidget *parent_m; int err; unsigned char c; int i; int reclen; int sockfd; int namelen; int portnum; int sin_size; int addrsize; struct sockaddr_in server_addr,client_addr,addr; unsigned char to_client[140]; }; #endif /*server.cpp */ #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netdb.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/select.h> #include <unistd.h> #include <arpa/inet.h> #include <qapplication.h> #include <qthread.h> #include <qsignal.h> #include <qobject.h> #include <qdialog.h> #include <qvariant.h> #include"encrypt.h" #include"certification.h" #include "VPN_usr.h" #include"server.h" #include "userevent.h" server::server() { portnum=5554; stopped= false; err=0; new_fd=0; if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) { printf("error in socket!\n"); err=1; } namelen=sizeof(struct sockaddr_in); bzero(&server_addr,namelen); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnum); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(server_addr.sin_zero),8); if ((bind(sockfd, (struct sockaddr *)(&server_addr), namelen))<0) { printf(" error in binding!\n"); err=1; } printf("Already bind\n"); } server::~server() { stopped =true; } void server::run() { while(!stopped) { if ((listen(sockfd, 10))<0) { printf(" error in listening!\n"); err=1; } printf("Listening now\n"); if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr), (socklen_t *)&sin_size))<0) { printf("error in accept!\n"); err=1; } if(new_fd!=0) printf(" connected with client!\n"); printf("Starting communication with client %s .\n",inet_ntoa(client_addr.sin_addr)); addrsize=sizeof(struct sockaddr_in); getpeername(new_fd,(struct sockaddr*)&addr,(socklen_t *)&addrsize); bzero(to_client, 140); bzero(from_client, 140); if(recv(new_fd,&c,1,MSG_PEEK)==-1) { printf(" Error when accept data from client!\n"); close(new_fd); } if(c==0xff) { i=0; while((reclen=recv(sockfd,&c,1,0)) > 0 && c!=0xfe) { from_client[i++]=c; } if(reclen<0) { printf(" Error when accept more data from client!\n"); close(new_fd); } else if(c==0xfe) from_client[i]=c; switch(from_client[1]) { case 0x0a: printf("receive sa data from client.\n"); //emit show_sa(); //QApplication::postEvent(parent_m, usre); break; default: printf("the data is does not follow the protocal.\n"); break; } } } stopped = false; } void server::stop() { stopped =true; }