2015-03-19 105 views
0

我已经做了一个Socket服务器和client.the客户端选择pdf文件并将其发送到服务器。此代码在本地机器上完美运行即服务器和客户端运行在同一主机上,文件传输在服务器端并打开随着内容,但当我运行服务器和客户端在不同的主机上我遇到以下问题服务器无法退出和文件传输被覆盖在服务器端,从而无法显示文件内容,如果我发送240来自客户端的kb文件在服务器上收到的文件为2 GB。 我在qt创建器中编程,客户端是一个Gui应用程序,它也运行Socket客户端代码,而服务器是控制台项目。C套接字服务器无法终止连接?

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); 

的问题是在这里

    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; 


    } 

回答

2

当你输入的字符串退出,这也将有\n

所以,当你比较字符串,比较像这样:

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

然后执行代码。现在该字符串将被匹配并且连接将被终止。

+0

你试过了吗? – 2015-03-20 07:56:24

+0

你试过了吗? – sharon 2015-03-21 05:02:45

+0

是的,我提供的解决方案无法正常工作..我解决了它..将更新解决方案 – 2015-03-21 08:45:42

相关问题