我正在使用以下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。
答案 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
。除非你有非常大的char
和sizeof(int) == 1
,否则这显然是错误的。
在许多其他方面重复同样的错误,例如,在Fill_COTP
,fscanf
中使用%d
指令填充temp
,其类型为{ {1}}而不是unsigned short
。
您可以更改指令(int
将填写一个%hhd
,而char
将填写一个%hd
; short
和{{1将填写%hhu
和%hu
)。但是,在没有任何错误检查的情况下,简单地调用这样的unsigned char
并不是非常强大。如果输入流的内容无法转换为目标类型,则调用将失败(unsigned short
将返回EOF或短计数,具体取决于失败的类型,“输入”与“匹配” ,以及失败的意义)。您可能需要一个小的中间函数来执行适当的错误检查,或许毕竟扫描到fscanf
,然后对值进行范围检查。