2013-02-02 53 views
0
#include <sys/socket.h> // for socket(), bind(), listen(), accept() 
#include <netinet/in.h> // for PF_INET, SOCK_STREAM, IPPROTO_TCP 
#include <stdio.h> // for printf(), perror() 
#include <unistd.h> // for read(), write(), close() 
#include <string.h> // for bzero() 

#define DEMO_PORT 9723 


int main(void) 
{ 
    //----------------------------------------- 
    // create an unnamed socket for the server 
    //----------------------------------------- 
    int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (sock < 0) 
    { 
     perror("opening stream socket"); 
     return -1; 
    } 
    printf("\nsock=%d \n", sock); 

    //---------------------------------------- 
    // construct a name for the server socket 
    //---------------------------------------- 
    struct sockaddr_in self; 
    socklen_t  nlen = sizeof self; 
    bzero(&self, sizeof self); 
    self.sin_family = AF_INET; 
    self.sin_port = htons(DEMO_PORT); 
    self.sin_addr.s_addr = htonl(INADDR_ANY); 
    if (bind(sock, (sockaddr *)&self, nlen) < 0) 
    { 
     perror("bind failed"); 
     return -1; 
    } 
    printf("bind succeeded port: %d\n",DEMO_PORT); 

    //--------------------------------------------------------- 
    // now create a connection queue and wait for some clients 
    //--------------------------------------------------------- 
    if (listen(sock, 5) < 0) 
    { 
     perror("listen failed"); 
     return -1; 
    } 
    printf("listen succeeded \n"); 


    //--------------------------------------------------- 
    // main loop to process clients' connection-requests 
    //--------------------------------------------------- 
    while (1) 
    { 
     sockaddr_in peer; 
     socklen_t plen = sizeof peer; 
     bzero(&peer, plen); 

     printf("server waiting \n"); 

     int client = accept(sock, (sockaddr *)&peer, &plen); 
     if (client < 0) { perror("accept"); break; } 

     //--------------------------------------------- 
     // we can now read from or write to the client 
     //--------------------------------------------- 
     char ch; 
     int index = 0; 
     char get[1024]; 

     if (read(client, &ch, 1) < 0) 
     { 
      perror("read"); 
     } 


     bool go = true; 


     while(go){ 

      if(ch != '/' && ch != '\r'){ 

       printf("read: %hhd\n", ch); 

       get[index] = ch; 
       printf("got stuff: %s\n", get); 

       index++; 

       read(index, &ch, 1); 


      } else { 

       go = false; 
       index = 0; 
       close(client); 
       printf("server responded, connection closed"); 


      } 
     } 


     //if (write(client, &ch, 1) < 0) { perror("write"); break; } 



    } 

    close(sock); 
    printf("\n"); 
} 

while(go)看起來從來沒有工作,它緩衝不正確。我沒有看到緩衝區內的模式或它的工作原理。寫入tcp服務器 - 緩衝流

這樣做的正確方法是什麼?除了一定數量的字節之外,將它們存儲在一個字符串中,如果到達換行符,則終止讀取操作?

回答

0

您正在傳遞索引到第二個讀取調用,您應該傳遞客戶端。

這可能不是你唯一的問題,但我認爲它是其中之一。

+0

不是客戶端也是一個整數? – stackOverFlew

+0

是的雖然'索引'可能不是傳遞給讀系統調用的正確整數。 – spartacus