使用线程安全的strtok_r

最近改写一个https://github.com/nickwinn/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);  
}