我要完成的工作:

我正在发出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/

10-12 05:54