调用函数后如何更改socketid的值

时间:2012-06-22 04:29:51

标签: c

我正在使用以下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&即使我在函数Fill_COTP()中没有使用这些值,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& s之间没有任何关系TPKT_Buff。

2 个答案:

答案 0 :(得分:1)

问题似乎在于:

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

您的TPCU_size是unsigned char TPDU_size;,其大小只有1个字节(假设这是'char'的大小),但您尝试放4个字节(假设它的大小为'int')在fscanf中进入它,从而可能覆盖它周围的内存。

答案 1 :(得分: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 char。除非你有非常大的charsizeof(int) == 1,否则这显然是错误的。

在许多其他方面重复同样的错误,例如,在Fill_COTPfscanf中使用%d指令填充temp,其类型为{ {1}}而不是unsigned short

您可以更改指令(int将填写一个%hhd,而char将填写一个%hd; short和{{1将填写%hhu%hu)。但是,在没有任何错误检查的情况下,简单地调用这样的unsigned char并不是非常强大。如果输入流的内容无法转换为目标类型,则调用将失败(unsigned short将返回EOF或短计数,具体取决于失败的类型,“输入”与“匹配” ,以及失败的意义)。您可能需要一个小的中间函数来执行适当的错误检查,或许毕竟扫描到fscanf,然后对值进行范围检查。