мне нужно прочитать в только значение заголовка, которые оканчиваются с \r\n\r\n
не может смотреть на конкретном полукоксе возвращенного RECV
Что-то вроде GETFILE OK 1024\r\n\r\n <content>
Я пытаюсь получить первый \r\n
и затем получить следующей пары в последующем вызове recv. Вызов этой функции: read_in_header(gfr, headerRecvBuff, 1);
Проблема: Логика в то время как со ссылкой на \n
полностью игнорируется, или не показывает никаких совпадений, когда я знаю, что они существуют. Это правильный способ сравнить символ char?
int read_in_header(gfcrequest_t *gfr, char *buf, int len) {
char *s = buf;
int slen = len;
int c = 0;
int count = 0;
//get the first \r\n pair
do {
c = recv(gfr->client_fd, s, slen, 0);
printf("checking to see what s has now: %s\n", s);
count += c;
} while ((c > 0) && (s[count - 1] != '\n'));
//get the second \r\n pair
count = 0;
do {
c = recv(gfr->client_fd, s, slen, 0);
printf("checking to see what s has now: %s\n", s);
count += c;
} while ((c > 0) && (s[count - 1] != '\n'));
printf("checking to see what s has now: %s\n", s);
if (c < 0) {
return c;
} else if (c == 0) {
puts("Time to disconnect, the server is done.");
//total bytes received should not include header length
gfr->totalbytesReceived -= gfr->headerbytes_received;
return 0;
} else {
s[c - 1] = '\0';
}
gfr->totalbytesReceived += count;
return c;
}
Если данные передаются в виде потока TCP, вы не можете полагаться на границах между данными посланных. Это ** поток **. Если вы попытаетесь получить 10 байт, вы можете получить 2 - или может быть 2000 байтов, ожидающих вас для чтения. –
Fyi, вы всегда читаете данные в начале памяти, адресованной 'buf'. (ака '' в этом коде). Но 's [count-1]' использует счетчик * накопленных *, а не число октетов, прочитанных на последнем вызове 'recv'. Короче говоря, при успешном 'recv', где' c> 0' считываемые данные будут находиться в 's [0..c-1]'. Я не понимаю, почему вы используете 'count' для индекса' s'. – WhozCraig
Да, сначала я думал, что recv будет добавляться в буфер, но пропустил это, будет каждый раз указателем на начало буфера. Я решил использовать комбинацию того, что вы сказали, и логику от @ryyker – leroneb