我需要getline()
来读取我的浏览器发送到我正在编程的Web服务器的请求标头。这是GetMessage函数这是应该做的任务:C getline函数不读取指定行
char *getMessage(int fd) {
FILE *sstream = fdopen(fd, "r");
// initialise block to 1 char and set it to null
char *block = malloc(sizeof(char));
*block = '\0';
int size = 1;
// Read from the file descriptor fd (using a FILE stream) until a blank line is
// received.
// Read 100 lines (buffersize) from sstream and put into the buffer. If lines have
// been successfully read concatenate them with block.
int buffersize = 100;
char *buffer = malloc (buffersize + 1);
while(getline(&buffer,&buffersize,sstream) != -1){
int length = strlen(buffer);
printf("Buffer length: %d\n",length);
block = realloc(block,strlen(block)+strlen(buffer)+1);
strcat(block,buffer);
if(strcmp(buffer,"\r\n") == 0) break;
}
int len = strlen(block);
printf("Block length: %d\n", len);
printf("%s \n", block);
return block;
}
基本上GetMessage函数(FD)的输入,是在我的主要方法宣告我的听力套接字的输入。我已经验证输出是正确的。现在我需要将文件描述符的输出转换为一个字符串并返回该字符串。但是,每次运行我的服务器时,它都会停留在while循环中。不执行循环中的语句。 编辑:添加了循环终止条件:现在它跳转到“块长度”immediatley。 非常感谢帮助!
喜加STRCMP语句跳出循环。仍然没有改变!是的,正如你所说的那样,一旦我收到传输的结尾,规范就会停止阅读。但即使增加休息也没有改变。没有循环中断,因此我得到“块长度:0”。 – Abhischek
@codaddict指出的问题也是有效的 - 你的编译器应该毫不含糊地告诉你这个问题。如果不是,则没有打开足够的警告。 –
呃!我注意到'realloc()'代码有'space = realloc(space,new_size)'内存泄漏反模式,并且没有错误检查。重复'strcat()'是次优的(导致二次行为)。我应该找到写这个的人并让他们修复它......哦......好吧,我应该修复它。它适用于没有错误的玩具样品。 –