0

クライアント側でsockfdを初期化するために次のAPIを使用しています:(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 はファイル ポインタです。関数 Fill_COTP(); でこれらの値を使用していなくても、sockfd と TPKT_Buff の値がゼロに変わる理由がわかりません。いくつかの提案をしてください。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機能する場合、それぞれが 1 つを埋めますがintbuf一連の を指しunsigned charます。sが非常に大きくcharsizeof(int) == 1これが明らかに間違っている場合を除きます。

同じ間違いが他の多くのポイントFill_COTPで繰り返されます。fscanf%dtempunsigned shortint

ディレクティブを変更することができます (%hhdはシングルchar%hd入力し、シングルは入力し、 は入力し、 は入力しますshort) 。ただし、エラー チェックを行わずにこのように呼び出すだけでは、あまり堅牢ではありません。入力ストリームの内容がターゲット タイプに変換できない場合、呼び出しは失敗します (失敗の種類、「入力」対「一致」、およびエラーのポイントに応じて、EOF または短いカウントのいずれかが返されます)。失敗)。適切なエラー チェックを行う小さな中間関数が必要な場合があります。たとえば、最終的に をスキャンしてから、値の範囲チェックを行います。%hhu%huunsigned charunsigned shortfscanffscanfint

于 2012-06-22T05:00:49.930 に答える