0

我正在使用以下 api 在客户端初始化 sockfd:(sockfd=3)

              if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol))  == -1) {
                    perror("client: socket");
                    continue;
            }

& 使用函数将我的 TPKT_Buff 初始化为 {3,0,0,0} 值:

            if(Fill_TPKT(PStack,TPKT_Buff) != 0)
  {
   printf("Error while filling TPKT Buffer");
   return 1;
  }printf("tpkt/2_Buff%x %x\n",TPKT_Buff[0],TPKT_Buff[1]);printf("sockfd=%d\n",sockfd);

但是,调用函数后:

 if(Fill_COTP(PStack,&cotp) != 0)
    {
     printf("Error while filling COTP Structure!");
     return 1;
    }

我的 socfd & TPKT_Buff 值更改为零 TPKT_Buff={0,0,0,0} & sockfd=0 :

printf("sockfd=%d\n",sockfd);
 printf("TPKT/2_Buff=%x %x\n",TPKT_Buff[0],TPKT_Buff[1]);

Fill_COTP & Fill_TPKT 函数定义如下:

  int Fill_TPKT(FILE *fptr,unsigned char *buf)
  {
   fseek(fptr,14,SEEK_SET);
   fscanf(fptr,"%d",buf+0);

   fseek(fptr,15,SEEK_CUR); 
   fscanf(fptr,"%d",buf+1);

   return 0;
  }

 int Fill_COTP(FILE *fptr, COTP *cotp)
 {
  unsigned short temp;

  fseek(fptr,13,SEEK_CUR);
  fscanf(fptr,"%d",&temp);
  cotp->Destination_Ref[1] = temp;
  cotp->Destination_Ref[0] = temp>>8;
  printf("%x %x\n",cotp->Destination_Ref[0],cotp->Destination_Ref[1]);
  fseek(fptr,13,SEEK_CUR);
  fscanf(fptr,"%d",&temp);
  cotp->Source_Ref[1] = temp;
  cotp->Source_Ref[0] = temp>>8;
  printf("%x %x\n",cotp->Source_Ref[0],cotp->Source_Ref[1]);
  fseek(fptr,14,SEEK_CUR);
  fscanf(fptr,"%d",&temp);
  cotp->Source_Tsap[1] = temp;
  cotp->Source_Tsap[0] = temp>>8;
  printf("%x %x\n",cotp->Source_Tsap[0],cotp->Source_Tsap[1]);
  fseek(fptr,14,SEEK_CUR);
  fscanf(fptr,"%d",&temp);
  cotp->Destination_Tsap[1] = temp;
  cotp->Destination_Tsap[0] = temp>>8;
  printf("%x %x\n",cotp->Destination_Tsap[0],cotp->Destination_Tsap[1]);
  fseek(fptr,17,SEEK_CUR);
  fscanf(fptr,"%d",&(cotp->TPDU_size));
  printf("%x\n",cotp->TPDU_size);
  return 0;
 }

这里 PStack 是一个文件指针。我不明白为什么我的 sockfd 和 TPKT_Buff 值变为零,即使我没有在我的函数 Fill_COTP(); 中使用这些值;请给点建议。COTP的定义是:

       typedef struct
         {
          unsigned char PDU_type;
          unsigned char Destination_Ref[2];
          unsigned char Source_Ref[2];
          unsigned char Source_Tsap[2];
          unsigned char Destination_Tsap[2];
          unsigned char TPDU_size;
         } COTP;

sockfd 和 TPKT_Buff 之间没有关系。

4

2 回答 2

1

问题似乎出在这条线上:

fscanf(fptr,"%d",&(cotp->TPDU_size)); 

您的 TPCU_size 大小unsigned char TPDU_size;仅为 1 个字节(假设这是“char”的大小),但您尝试在 fscanf 期间将 4 个字节(假设为“int”的大小)放入其中,从而可能覆盖周围的记忆。

于 2012-06-22T04:52:08.937 回答
0

虽然缺少一些信息,但您所显示的某些信息显然是错误的,并且很可能与问题有关。例如:

int Fill_TPKT(FILE *fptr,unsigned char *buf)
  {
   fseek(fptr,14,SEEK_SET);
   fscanf(fptr,"%d",buf+0);

   fseek(fptr,15,SEEK_CUR); 
   fscanf(fptr,"%d",buf+1);

如果每次调用都fscanf有效,则每个都将填写一个int,但buf指向一个unsigned chars 序列。除非你有非常大char的 s ,sizeof(int) == 1这显然是错误的。

同样的错误在许多其他点上重复出现,例如 in Fill_COTPfscanf使用%d指令填充temp,它的类型unsigned short而不是int

您可以更改指令(%hhd将填写一个char并将%hd填写一个short%hhu并将%hu填写unsigned charunsigned short)。然而,fscanf像这样简单地调用,没有任何错误检查,不是很健壮。如果输入流的内容不能转换为目标类型,则调用将失败(fscanf将返回 EOF 或短计数,具体取决于失败的类型、“输入”与“匹配”以及失败)。您可能需要一个小的中间函数来进行适当的错误检查,int例如扫描到一个,然后对值进行范围检查。

于 2012-06-22T05:00:49.930 回答