使用线程安全的strtok_r

最近改写一个dns-flood的程序为多线程模式,发现每个线程中生成的随机数字经常是一样 。


void nameformat(char *name, char *QS)
{
        char *bungle, *x;
        char elem[128];

        *QS = 0;
        bungle = malloc(strlen(name) + 3);
        strcpy(bungle, name);
        x = strtok(bungle, ".");
        while (x != NULL) {
            if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) {
                puts("String overflow.");
                exit(1);
            }
            strcat(QS, elem);
            x = strtok(NULL, ".");
        }
        free(bungle);
}

该函数是在构造DNS请求报文中被调用,通过传入指针name将字符串复制到QS指向的地址内。debug发现QS经常打印出来和name不一样,查了发现strtok不是线程安全的,改用strtok_r后终于OK了。


void nameformat_r(char *name, char *QS)
{
        char *bungle, *x;
        char elem[128];
        char *flag;
        *QS = 0;
        bungle = malloc(strlen(name) + 3);
        strcpy(bungle, name);
        x = strtok_r(bungle, ".", &flag);
        while (x != NULL) {
            if (snprintf(elem, 128, "%c%s", strlen(x), x) == 128) {
                puts("String overflow.");
                exit(1);
            }
            strcat(QS, elem);
            x = strtok_r(NULL, ".", &flag);
        }
        free(bungle);
}
此条目发表在ANCI C分类目录。将固定链接加入收藏夹。

发表评论