我要完成的工作:
我正在发出3000个请求并捕获该请求的8个字节。我将回复贴在:
struct negs
{
int neg_num;
char neg_key[9];
};
其中
neg_num == i
(请求编号)和
memcpy(nego[neg_count].neg_key, recv_data+73,8);
我需要在nego结构中找到任何重复的neg_keys。我正在尝试使用qsort完成此操作……这是我的比较功能:
int compare( const void* a, const void* b ){
negs *ia = *(negs **)a;
negs *ib = *(negs **)b;
return memcmp(ia->neg_key, ia->neg_key, 8);
}
和我给qsort的电话:
printf("Sizeof = %d"), sizeof(*nego);
qsort(nego,4,sizeof(*nego),compare);
printf("Sizeof2 = %d"), sizeof(*nego);
我打算仅在调用后查看sizeof是否存在差异,但这总是返回:
Sizeof = 159218900
Sizeof2 = 4
我是否以错误的方式处理?有什么建议么?
这是段错误的相关代码:
char current_key[9];
int key_index = 0;
int dupe_count = 0;
typedef struct {
int neg_num;
char neg_key[9];
} negs;
struct negs
{
int neg_num;
char neg_key[9];
};
...
int compare( const void* a, const void* b ){
negs *ia = *(negs **)a;
negs *ib = *(negs **)b;
return memcmp(ia->neg_key, ia->neg_key, 8);
}
...
main(int argc, char **argv) {
char send_smbNego[] = {
0x00,0x00,0x00,0x54,0xFf,0x53
};
int neg_count = 0;
int neg_max = 3000;
struct negs *nego;
nego = malloc(neg_max * sizeof(struct negs));
for (neg_count = 0 ; neg_count < neg_max ; neg_count++){
if ((sock = open_socket(target, TCP, 445))>=0) {
send(sock, send_smbNego, sizeof(send_smbNego), 0);
len = recv(sock, recv_data, OUTBUF_LEN, 0);
if (len > 81) { // This should be changed to look for SMB header: ff534d42 followed by 72 which is SMB Command Negotiate Protocol, followed by 00000000 which indicates success. The encryption key or challenge token is at offset 73 and is 8 bytes long;
nego[neg_count].neg_num = neg_count;
memcpy(current_key, recv_data+73,8);
memcpy(nego[neg_count].neg_key, recv_data+73,8);
//print_hex("Key 1 = ",nego[neg_count].neg_key,8);
//printf("\n");
}
close(sock);
}
print_hex("Key number 0",nego[0].neg_key,8);
printf("Sizeof = %d"), sizeof(*nego);
qsort(nego,4,sizeof(*nego),compare);
printf("Sizeof2 = %d"), sizeof(*nego);
}
}
最佳答案
对于初学者来说,它看起来像:
return memcmp(ia->neg_key, ia->neg_key, 8);
应该:-
return memcmp(ia->neg_key, ib->neg_key, 8);
您还告诉qsort,数组中有4个要排序的元素,而您有3000:-
qsort(nego,4,sizeof(*nego),compare);
但是大多数
qsort
都不会删除数组中的重复项,因此即使sizeof()做了您要执行的操作,数组在排序前后的大小仍然相同。但是,对于要完成排序的事情来说,这是一个不错的第一步,但是您必须在排序之后遍历数组,并通过将每个元素都移到下一个元素来查找重复项。
关于c - 使用qsort报告结构数组中的重复项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2388743/