2011-07-28 60 views
1

在我的插座代碼閱讀()訪問緩衝區我有以下結構:使用插座

服務器:

  #include <stdio.h> 
     #include <stdlib.h> 
     #include <string.h> 
     #include <sys/types.h> 
     #include <sys/socket.h> 
     #include <netinet/in.h> 
     #define MAXPROFILES 2 

     int main(int argc, char *argv[]) 
    { 
     int sockfd, newsockfd, portno, clilen; 
     struct sockaddr_in serv_addr, cli_addr; 
     unsigned char buf[1024]; 
     char* pointer = buf; 

     struct profile_t 
    { 
     unsigned char length; 
     unsigned char type; 
     unsigned char *data; 
    }; 

     typedef struct profile_datagram_t 
    { 
     unsigned char src[4]; 
     unsigned char dst[4]; 
     unsigned char ver; 
     unsigned char n; 
     struct profile_t profiles[MAXPROFILES]; 
    } header; 


     header outObj; 

     int j =0; 
     int i =0; 


     if (argc < 2) { 
     fprintf(stderr,"usage: %s port_number1",argv[0]); 
     exit(1); 
    } 
     sockfd = socket(AF_INET, SOCK_STREAM, 0); 
     if (sockfd < 0) 
     error("ERROR DETECTED !!! Problem in opening socket"); 

     bzero((char *) &serv_addr, sizeof(serv_addr)); 
     portno = atoi(argv[1]); 

     serv_addr.sin_family = AF_INET; 
     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
     serv_addr.sin_port = htons(portno); 

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
      error("ERROR DETECTED !!! There was a problem in binding"); 

     listen(sockfd, 10); 
     clilen = sizeof(cli_addr); 



     printf("Server listening on port number %d...\n", serv_addr.sin_port); 

     newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen); 

     if (newsockfd < 0) 
     error("ERROR DETECTED !!! the connection request was not accepted"); 

     int rc = read(newsockfd,&pointer,100); 
     if(rc < 0){ 
     printf("error"); 
     } 
     else { 
     printf("success %d",rc); 
     } 
     for(int i=0;i<29;i++){ 
     printf(pointer); 
     printf(buf); 
     } 





return 0; 

}

客戶:

  int main(int argc, char *argv[]) 

     { 
      int sockfd, portno, n; 
      struct sockaddr_in serv_addr; 
      struct hostent *server; 
      unsigned char buf[1024]; 
      unsigned int srcAddress = 2193598184; 
      unsigned int destAddress = 2193598182; 

      struct profile_t 
     { 
      unsigned char length; 
      unsigned char type; 
      unsigned char *data; 
     }; 

      typedef struct profile_datagram_t 
     { 
      unsigned char src[4]; 
      unsigned char dst[4]; 
      unsigned char ver; 
      unsigned char n; 
      struct profile_t profiles[MAXPROFILES]; 
     } header; 


      header outObj; 

      int j =0; 
      int i =0; 
     // for loop for doing the malloc so that we can allocate memory to all profiles 
      for(i=0;i<MAXPROFILES;i++){ 
      outObj.profiles[i].data = malloc(5); 
     } 


      for(i=0;i<4;i++){ 
      outObj.src[i] = (srcAddress >> (i*8)) & 0xFF; 
      outObj.dst[i] = (destAddress >> (i*8)) & 0xFF; 
     } 
      outObj.ver = 1; 
      outObj.n = 2; 

      memcpy(buf,&outObj.src,4); 
      memcpy(buf+4,&outObj.dst,4); 
      memcpy(buf+8,&outObj.ver,1); 
      memcpy(buf+9,&outObj.n,2); 


      outObj.profiles[0].length = 5; 
      outObj.profiles[0].type = 1; 
      outObj.profiles[1].length = 5; 
      outObj.profiles[1].type = 2; 

      for(i=0;i<MAXPROFILES;i++){ 
      for(j=0;j<5;j++){ 
      outObj.profiles[i].data[j] = j+1; 
     } 
     } 



      int k = 11; 


      for(i=0;i<MAXPROFILES;i++){ 
      memcpy(buf+k,&outObj.profiles[0].length,1); 
      memcpy(buf+k+1,&outObj.profiles[0].type,1); 
      memcpy(buf+k+2,outObj.profiles[0].data,5); 
      k +=7; 
     } 


      if (argc < 3) { 
      fprintf(stderr,"usage: %s hostname port\n", argv[0]); 
      exit(0); 
     } 
      portno = atoi(argv[2]); //Convert ASCII to integer 
      sockfd = socket(AF_INET, SOCK_STREAM, 0); // socket file descriptor 


      if (sockfd < 0) 
      error("ERROR DETECTED !!! Problem in opening socket\n"); 

      server = gethostbyname(argv[1]); 
      if (server == NULL) { 
      fprintf(stderr,"ERROR DETECTED !!!, no such server found \n"); 
      exit(0); 
     } 

      bzero((char *) &serv_addr, sizeof(serv_addr)); //clear the memory for server address 

      serv_addr.sin_family = AF_INET; 
      bcopy((char *)server->h_addr, 
       (char *)&serv_addr.sin_addr.s_addr, 
        server->h_length); 

      serv_addr.sin_port = htons(portno); 

      printf("Client 1 trying to connect with server host %s on port %d\n", argv[1], portno); 


      if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
      error("ERROR in connection"); 

      printf("SUCCESS !!! Connection established \n"); 


      if (write(sockfd, buf, k) < 0) 
      { 
      error("Write error has occured "); 
      } 


      return 0; 
      } 

現在從客戶端我對我的unsigned char buf做一個memcpy併發送數據。在recv方面如何訪問我的「buf」中的值。我嘗試了「*」操作符,但我得到一個警告

arning:âprintfâ的傳遞參數1時將整數指針不進行強制轉換

我想基本上訪問內部緩衝區中的值,因爲我知道大小我應該能夠重新填充我的數據包。我知道這是一個「C」問題,並不完全是「套接字相關」。任何幫助都會非常有幫助。

回答

1

在服務器端,你只需要逆轉你在客戶端做的事情:

你也沒有得到任何東西,只需要使用char *pointer = buf,直接讀入緩衝區。當您循環查找MAXPROFILES時,只需檢查您在buffer中的當前位置,並返回size,以確保您沒有讀取沒有收到的數據。

例如:

int size = read(newsockfd, buffer, sizeof(buffer)); 

    int src, dst; 
    char ver; 
    short n; 

    memcpy(&src, buf + 0, 4); 
    memcpy(&dst, buf + 4, 4); 
    memcpy(&ver, buf + 8, 1); 
    memcpy(&n, buf + 9, 2); 

...等等...

你編碼在客戶端的結構/數據,所以你必須給他們在服務器端進行解碼。一旦你這樣做了,那麼你就可以打印出來或做任何事情是你喜歡:

printf("src: %d dst: %d ver: %c n: %d\n", src, dst, ver, n); 

此外,爲了簡化您的編碼/解碼,用同樣的方法(如memcpy,而不是你逐與掩碼方法的字節)。例如,在客戶端:

k = 0; 
    memcpy(buf + k, &src, sizeof(src)); k += sizeof(src); 
    memcpy(buf + k, &dst, sizeof(dst)); k += sizeof(dst); 
    ... 

這也可以讓您從硬編碼數字中解脫出來,就像我在上面做的那樣。只要確保你的srcdst,以及其餘的在客戶端和服務器上都具有相同的類型。

+0

非常感謝您的回覆...代碼得到了遵守,沒有一個警告......謝謝噸!!!對於一個無符號字符,正如我已經使用,如何給printf語句......我的意思是應該它是「%c」還是「%d」??? – user537670

+0

對於無符號整數,您可以使用'%u'作爲無符號整數,或'%h'作爲無符號短整數。 – unpythonic

0

你的意思是gcc在這一行上發出警告:「int rc = read(newsockfd,& pointer,100);」

您的變量 「指針」 本身就是一個指向BUF,所以你不需要使用&指針,只要使用這樣的:

INT RC =讀(newsockfd,指針,100)