每当我尝试提供像/home/..../TulsaQueen.mp3这样的文件时,程序会产生分段错误。 gdb说它与strlen()有关,但我无法弄明白。为什么会这样? 我正在创建一个服务器,需要处理GET请求我的.jpg每次都有效,但.mp3没有。
@columnsvalue
这是我得到的错误
线程2“a.out”收到信号SIGSEGV,分段故障。 (gdb)在哪里 (0)strlen()at ../sysdeps/x86_64/strlen.S:106(1) 位于ioputs.c的_IO_puts(str = 0x0)中的0x00007ffff764069c:35(2) 0x00000000401623在connectionThread()(3)0x00007ffff7bc16ba中 start_thread(arg = 0x7ffff73b6700)at pthread_create.c:333(4) clone()中的0x00007ffff76d782d ../ sysdeps / UNIX / SYSV / LINUX / x86_64的/ clone.S:109
答案 0 :(得分:0)
代码中的一个可能解释问题的错误与缓冲区大小memset
和read
...
缓冲区长度恰好为1024字节。将所有这些字节设置为0
,然后读取最多1024个字节。
但是,当您在末尾读取没有任何NUL
(0)字节的1024个字节时会发生什么? ...
...如果发生这种情况,strlen
会在搜索NUL
字节时溢出(在字节1025及之后),导致分段错误。
解决这个特定问题的一种方法是读取1023个字节......即:
memset(buffer, 0, 1024);
n = read(newsockfd,buffer,1023);
解决此特定问题的更好方法(如注释中所示)将使用n
来设置NUL字节值。即:
n = read(newsockfd,buffer,1023);
if (n < 0) {
// ...
}
buffer[n] = 0;
这样可以确保NUL字节始终存在于分配的缓冲区中。
我应该指出,用strtok
标记字符串,以及使用str*
函数来解析传入的数据,有点无效,可能会产生意外的错误/结果......
...尤其是当您处于多线程环境中时......
例如,strtok
不是线程安全的......即使存在线程安全的变体,但它也不太理想。
此外,它可能会无意中破坏传入的数据 - 毕竟,您只使用第一个&#34;令牌&#34;,所以我假设您希望其余数据保持不变。
祝你好运!
P.S。
strlen(magic_file(myt,token))
- 如果magic_file(myt,token)
是无效字符串(即NULL)怎么办?
strlen("\r\n\r\n")
总是4 ...为什么要为此使用函数调用?
free(buffer)
应该是free(str_size)