2015-06-07 53 views
0

我想創建一個服務器,客戶端放和得到的方法,但我真的不知道從哪裏開始,如何讓服務器運行我處理的命令。任何幫助將非常感激。GET和PUT命令與C++服務器客戶端

客戶端文件

void Copy(char *filename1,char *filename2); 

int main(int argc, char **argv) 
{ 
    if(argc == 3) 
    { 
     int Sockfd; 
     sockaddr_in ServAddr; 
     hostent *HostPtr; 
     int Port = atoi(argv[2]); 
     int BuffSize = 0; 

     // get the address of the host 
     HostPtr = Gethostbyname(argv[1]); 

     if(HostPtr->h_addrtype != AF_INET) 
     { 
      perror("Unknown address type!"); 
      exit(1); 
     } 

     memset((char *) &ServAddr, 0, sizeof(ServAddr)); 
     ServAddr.sin_family = AF_INET; 
     ServAddr.sin_addr.s_addr = ((in_addr*)HostPtr->h_addr_list[0])->s_addr; 
     ServAddr.sin_port = htons(Port); 


     // open a TCP socket 
     Sockfd = Socket(AF_INET, SOCK_STREAM, 0); 

     // connect to the server 
     Connect(Sockfd, (sockaddr*)&ServAddr, sizeof(ServAddr)); 

     char userI[256]; 
     // write a message to the server 

     int dupSockfd = dup(Sockfd); 

     FILE* writeFile = fdopen(Sockfd, "w"); 
     FILE* readFile = fdopen(dupSockfd, "r"); 

     setlinebuf(writeFile); 

     char writerBuff[256]; 

     for(;;) 
     { 
      cout << "ftp> "; 
      if(fgets(userI, sizeof(userI), stdin)) 
      { 
       if(userI == "exit") 
       { 
        return 1; 
       } 
       else 
       { 
        string cmd, f1, f2; 

        istringstream iss(userI, istringstream::in); 

        iss >> cmd >> f1 >> f2; 

        cout << cmd << "." << f1 << "." << f2 << endl; 



        if(cmd == "get") 
        { 
         write(Sockfd, "get", sizeof("get")); 

         Copy(f1, f2); 
        } 


       } 
      } 

     } 

     close(Sockfd); 
    } 
    else 
    { 
     cout << "Incorrect commands for running... try './client (hostname) (port)'" << endl; 
     return 1;// 
    } 
    return 0;// 
} 

void Copy(char *filename1,char *filename2) { 

    const int BUFSIZE=2048; 
    char buffer[BUFSIZE]; 
    ifstream fin; 
    ofstream fout; 
    long filelen, bytesRemaining, bytes; 

    // Open the file to be transferred, check it exists. 
    fin.open(filename1); 
    if (!fin.good()) 
    { 
     cerr << "Problems opening \"" << filename1 << "\" (" << errno << "): " << strerror(errno) << endl; 
     exit(1); 
    } 
    fout.open(filename2); 
    if (!fout.good()) 
    { 
     cerr << "Problems opening \"" << filename2 << "\" (" << errno << "): " << strerror(errno) << endl; 
     exit(1); 
    } 
    // Determine the file's length. 
    fin.seekg(0,ios::end); 
    if(fin.fail()) cerr<<"seekg() fail!\n"; 
    filelen = fin.tellg(); 
    if(fin.fail()) cerr<<"tellg() fail!\n"; 
    fin.seekg(0, ios::beg); 
    if(fin.fail()) cerr<<"seekg() fail!\n"; 

    // Copy the file data. 
    bytesRemaining = filelen; 
    while (bytesRemaining > 0) 
    { 
     bytes = bytesRemaining > BUFSIZE ? BUFSIZE : bytesRemaining; 
     fin.read(buffer,bytes); 
     if(fin.fail()){ 
      cerr<<"read() error\n"; 
      exit(1); 
     } 
     fout.write(buffer,bytes); 
     if(fout.fail()){ 
      cerr<<"write() error\n"; 
      exit(1); 
     } 
     bytesRemaining -= bytes; 
    } 
    fin.close(); 
    fout.close(); 
} 

服務器文件

int main(int argc, char **argv) 
{ 
    if(argc == 2) 
    { 
     int Sockfd, NewSockfd, ClntLen; 
     sockaddr_in ClntAddr, ServAddr; 

     int Port = atoi(argv[1]); 
     char String[MAX_SIZE]; 
     int Len; 

     // open a TCP socket (an Internet stream socket) 
     Sockfd = Socket(AF_INET, SOCK_STREAM, 0); // socket() wrapper fn 

     // bind the local address, so that the client can send to server 
     memset((char*)&ServAddr, 0, sizeof(ServAddr)); 
     ServAddr.sin_family = AF_INET; 
     ServAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
     ServAddr.sin_port = htons(Port); 

     int opt = 1; 

     setsockopt(Sockfd,SOL_SOCKET,SO_REUSEADDR, (void*)opt, sizeof(opt)); 


     Bind(Sockfd, (sockaddr*) &ServAddr, sizeof(ServAddr)); 

     // listen to the socket 
     Listen(Sockfd, 5); 

     int RecvMsgSize; 

     for(;;) 
     { 
      // wait for a connection from a client; this is an iterative server 
      ClntLen = sizeof(ClntAddr); 
      NewSockfd = Accept(Sockfd, (sockaddr*)&ClntAddr, &ClntLen); 

      if((RecvMsgSize = recv(ClntSocket, EchoBuffer, RCVBUFSIZE, 0)) < 0) 
      { 
       perror("recv() failed"); 
       exit(1); 
      } 

      // read a message from the client 
      Len = read(NewSockfd, String, MAX_SIZE); 
      String[Len] = 0;// make sure it's a proper string 
      cout<< String << endl; 

      close(NewSockfd); 
     } 
    } 
    else 
    { 
     cout << "Incorrect commands for running... try './server (port)'" << endl; 
     return 1;// 
    } 
    return 0;// 
} 
+0

您可能希望確保您發佈的代碼能夠編譯。 – alk

回答

1

你想創建一個Web服務器來處理GET和PUT請求嗎?您首先需要了解http的工作原理。讓我簡單地解釋一下。

首先嚐試開發自己的服務器,並將其連接到瀏覽器:

詞根記憶您的服務器偵聽端口80 - 這是一個必須

2.創建一個緩衝區,將讀取請求瀏覽器(客戶端),因爲你在你的代碼的這部分做的事:

if((RecvMsgSize = recv(ClntSocket, EchoBuffer, RCVBUFSIZE, 0)) < 0) 
     { 
      perror("recv() failed"); 
      exit(1); 
     } 

     // read a message from the client 
     Len = read(NewSockfd, String, MAX_SIZE); 
     String[Len] = 0;// make sure it's a proper string 
     cout<< String << endl; 

     close(NewSockfd); 

所以這個String對象是你的緩衝區,它將包含HTTP請求。

3.您需要解析請求。解析請求,看是否該方法是GET PUT POST或等

這是一個示例GET請求:

https://marketing.adobe.com/developer/documentation/data-insertion/r-sample-http-get

4.然後你需要發送正確的響應返回給客戶端的這種情況下,瀏覽器:

http://pastebin.com/BPnVHym5

5.Connect您的瀏覽器向服務器通過在地址欄輸入您的IP地址