Для заголовков HTTP использует пары возврата каретки + перевода строки, чтобы отметить окончания строки - так что «^ M», который вы видите, является символом возврата каретки.Окончания строк в теле после заголовков могут быть помечены по-разному, если это разрешено конкретным приложением.
Конец заголовков отмечен пустой строкой, поэтому первым символом в этой строке является возврат каретки(даже другие пробелы не могут появиться перед ним).Таким образом, когда вы впервые обнаружите '\ r' в качестве первого символа в строке, вы обнаружите конец заголовков;все остальные линии являются частью тела.
if(newline == "\r\n"){
не работает, потому что вы не можете сравнивать строки таким образом - вы проверяете адрес, на который указывает newline
, на равенство с адресом строкового литерала "\r\n"
, чтобудет ложным, даже если символы в newline
совпадают.strcmp()
или strncmp()
будет работать, но, поскольку это всего два символа, вы можете сравнить их по отдельности (может быть, даже быстрее).Также маловероятно, что вы получите '\r'
вне конца строки, так что вы, вероятно, можете просто проверить это.
Если buf
достаточно велико, чтобы вместить любую из строк заголовка,следующее примерно описывает, что делать (хотя бы один подход):
char buf[BUFSZ];
// ...
while( fgets( buf, BUFSZ, sock ) ) {
if (buf[0] == '\r') { // or (buf[0] == '\r' && buf[1] == '\n') to be strict
// DO STUFF for end of header section
break;
} else {
// DO STUFF for a header line
}
}
// if needed, get rest of document
while( fgets( buf, BUFSZ, sock ) ) {
// DO STUFF for a body line
}