Richie_rich19
Richie_rich19

Reputation: 1

C Socket Server is unable to terminate connection?

I have made a Socket server and client.the client selects the pdf file and sends it to the server.This code runs perfectly on local machine i.e Server and client run on same host,the file is transfered on the server side and opens up with the content but when i run server and client on different hosts i encounter the following problem the Server is unable to quit and file transfered is getting overwritten at the server side,thus unable to show file content,like if i am sending a 240 kb file from client the file received at the server is of 2 GB. I am programming in qt creator,and the client is a Gui application that also runs Socket client code while server is a console project.

This is server.cpp
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define Size 2048

    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        int s, fd, len;
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
        socklen_t sin_size;
        char buf[BUFSIZ];
        FILE *fp = fopen("/home/D.A.D19/Desktop/Filecopy/Q7Basic_essentials.pdf","a+");
        memset(&my_addr, 0, sizeof(my_addr));
        my_addr.sin_family = AF_INET;
        my_addr.sin_addr.s_addr = inet_addr("192.168.103.128");
        my_addr.sin_port = htons(8000);
        if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
        qWarning("socket");

        return 1;
        }
        if (bind(s,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
        {
        qWarning("bind");
        return 1;
        }
        listen(s, 5);
        sin_size = sizeof(struct sockaddr_in);
        if ((fd =accept(s,(struct sockaddr *)&remote_addr,&sin_size)) < 0)
        {
        qWarning("accepted client %s\n", inet_ntoa(remote_addr.sin_addr));
        return 1;
        }

        len = send(fd, "Welcome to my server\n", 21, 0);

            while(1)
            {
                len = recv(fd,buf,Size,0);

The problem is here

                 if (strcmp(buf,"quit") == 0){
                    qWarning("Connection terminated");
                    break;

                }

                fwrite(buf,Size,1, fp);
                memset(buf,0,Size);
            }


        fclose(fp);
        close(fd);
        close(s);

        return a.exec();
    }

    This is Client.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLabel>
    #include <QPushButton>
    #include <QFileDialog>
    #include <QLineEdit>
    #include <QString>
    #include <QtCore/QCoreApplication>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #define SIZE 2048

    QString Path;
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        QLabel *label1 = new QLabel(this);
        label1->setText("FileName");
        label1->setGeometry(15,25,70,30);
        label1->show();


        QPushButton *pushbutton = new QPushButton(this);
        pushbutton->setText("Browse");
        pushbutton->setGeometry(180,28,90,25);
        pushbutton->show();

        QObject::connect(pushbutton,SIGNAL(clicked()),this, SLOT(browse()));

    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }

    void MainWindow::browse()
    {
        int s, len;
            struct sockaddr_in remote_addr;
            char buf[BUFSIZ];
            memset(&remote_addr, 0, sizeof(remote_addr));

            remote_addr.sin_family = AF_INET;
            remote_addr.sin_addr.s_addr = inet_addr("192.168.103.128");
            remote_addr.sin_port = htons(8000);

        QLineEdit *line = new  QLineEdit(this);
        line->setGeometry(82,28,90,25);
        QString  filename = QFileDialog::getOpenFileName(this,tr("Find files"),
                                                         "/home/D.A.D19/Desktop");
        line->setText(filename);
        line->show();



        if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            qWarning("socket");
            //return 1;
        }


        if (::connect(s, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) < 0)
        {
            qWarning("connect");
            //return 1;
        }



       qWarning("connected to server \n");
       len = recv(s, buf, BUFSIZ, 0);
       qWarning("%s \n",buf);
       buf[len] = '\0';

        sprintf(buf, "%s", qPrintable(filename));

        FILE *fp = fopen(buf,"r");

            while(1)
            {
                if(feof(fp))
                {
                    strcpy(buf,"quit");
                    send(s,buf,SIZE,0);
                    break;
                }
                if(!feof(fp))
                {
                int count = fread(buf,SIZE,1,fp);
                len = send(s, buf,SIZE, 0);
                memset(buf,0,SIZE);
                }




            }

            fclose(fp);
            ::close(s);
            return;


    }

Upvotes: 0

Views: 116

Answers (1)

sharon
sharon

Reputation: 734

When you enter the string quit, it will also have the \n.

So when you compare the string, compare like this:

     if (strcmp(buf,"quit\n") == 0)

And then execute the code. Now the string will be matched and connection will be terminated.

Upvotes: 2

Related Questions