#include #include #include #include #include #include #include #include #include #include #include #include "client.h" #include "ui_client.h" #define SERVER_TCP_PORT 7000 // Default port #define BUFLEN 255 // Buffer length #define USRSIZE 100 Client::Client(QWidget *parent) : QMainWindow(parent), ui(new Ui::Client) { ui->setupUi(this); } Client::~Client() { delete ui; } void Client::on_sendButton_clicked() { ui->chatwin->setText(ui->msg->text()); } void Client::ioLoop() { int n, bytes_to_read; int sd, port; struct hostent *hp; struct sockaddr_in server; char *host, *bp, rbuf[BUFLEN], sbuf[BUFLEN], **pptr; char str[16]; bool forkFlag = true; char usrName[USRSIZE]; char temp[BUFLEN]; char closeChat[] = "--close"; char localhost[] = "127.0.0.1"; pid_t childpid; childpid = fork(); if(childpid > 0){ /*switch(argc) { case 1: host = localhost; port = SERVER_TCP_PORT; break; case 2: host = argv[1]; // Host name port = SERVER_TCP_PORT; break; case 3: host = argv[1]; port = atoi(argv[2]); // User specified port break; default: fprintf(stderr, "Usage: %s host [port]\n", argv[0]); exit(1); }*/ // Create the socket if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("Cannot create socket"); exit(1); } bzero((char *)&server, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(port); if ((hp = gethostbyname(host)) == NULL) { fprintf(stderr, "Unknown server address\n"); exit(1); } bcopy(hp->h_addr, (char *)&server.sin_addr, hp->h_length); printf("Enter a username: "); //fgets (usrName, sizeof(usrName), stdin); for(int k = 0; k < USRSIZE; k++) { if(usrName[k] == '\n') usrName[k] = '\0'; } strcat(usrName, ": "); // Connecting to the server if (connect (sd, (struct sockaddr *)&server, sizeof(server)) == -1) { fprintf(stderr, "Can't connect to server\n"); perror("connect"); exit(1); } printf("Connected: Server Name: %s\n", hp->h_name); pptr = hp->h_addr_list; printf("\t\tIP Address: %s\n", inet_ntop(hp->h_addrtype, *pptr, str, sizeof(str))); while(true){ printf(usrName); //gets(sbuf); // get user's text //fgets (sbuf, BUFLEN - USRSIZE, stdin); if(strcmp(sbuf, closeChat) != 0) { strcpy(temp, usrName); strcat(temp, sbuf); strcpy(sbuf, temp); } else { break; } // Transmit data through the socket send (sd, sbuf, BUFLEN, 0); if(forkFlag) { forkFlag = false; if(fork()) { while(true) { //printf("Receive:\n"); bp = rbuf; bytes_to_read = BUFLEN; // client makes repeated calls to recv until no more data is expected to arrive. n = 0; while ((n = recv (sd, bp, bytes_to_read, 0)) < BUFLEN) { bp += n; bytes_to_read -= n; } printf ("%s\n", rbuf); } } } } fflush(stdout); close (sd); } }