2011-07-28 58 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)