Ну, мне нужно помочь: Я хочу написать функцию, которая читается по строкам из буфера сокета, полученного из третьего параметра из read()
, из заголовка unistd.h
.чтение строки за строкой из буфера сокета
Я написал:
int sgetline(int fd, char ** out)
{
int buf_size = 128;
int bytesloaded = 0;
char buf[2];
char * buffer = malloc(buf_size);
char * newbuf;
int size = 0;
assert(NULL != buffer);
while(read(fd, buf, 1) > 0)
{
strcat(buffer, buf);
buf[1] = '\0';
bytesloaded += strlen(buf);
size = size + buf_size;
if(buf[0] == '\n')
{
*out = buffer;
return bytesloaded;
}
if(bytesloaded >= size)
{
size = size + buf_size;
newbuf = realloc(buffer, size);
if(NULL != newbuf)
{
buffer = newbuf;
}
else
{
printf("sgetline() allocation failed!\n");
exit(1);
}
}
}
*out = buffer;
return bytesloaded;
}
, но у меня есть некоторые проблемы с этой функцией, например, если вход что-то вроде:
HTTP/1.1 301 Moved Permanently\r\n
Cache-Control:no-cache\r\n
Content-Length:0\r\n
Location\r\nhttp://bing.com/\r\n
\r\n\r\n
и я
int sockfd = socket(...);
//....
char* tbuf;
while(sgetline(sockfd, &tbuf) > 0)
{
if(strcmp(tbuf,"\r\n\r\n") == 0)
{
printf("End of Headers detected.\n");
}
}
вышеуказанное приложение C не выводит "End of Header detected."
. Зачем? как это исправить? советы по улучшению этих функций очень ценятся. Заранее спасибо. :)
Как получить значок «Известный вопрос» с ** 0 ** upvotes haha. – Jack
См. Реализацию [TLPI readline] (http://man7.org/tlpi/code/online/dist/sockets/read_line.c.html). – mmoya