2015-06-08 3 views
0

мне нужно прочитать в только значение заголовка, которые оканчиваются с \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; 
} 
+1

Если данные передаются в виде потока TCP, вы не можете полагаться на границах между данными посланных. Это ** поток **. Если вы попытаетесь получить 10 байт, вы можете получить 2 - или может быть 2000 байтов, ожидающих вас для чтения. –

+1

Fyi, вы всегда читаете данные в начале памяти, адресованной 'buf'. (ака '' в этом коде). Но 's [count-1]' использует счетчик * накопленных *, а не число октетов, прочитанных на последнем вызове 'recv'. Короче говоря, при успешном 'recv', где' c> 0' считываемые данные будут находиться в 's [0..c-1]'. Я не понимаю, почему вы используете 'count' для индекса' s'. – WhozCraig

+0

Да, сначала я думал, что recv будет добавляться в буфер, но пропустил это, будет каждый раз указателем на начало буфера. Я решил использовать комбинацию того, что вы сказали, и логику от @ryyker – leroneb

ответ

0

Что касается ли это правильный способ сравнить обугленного новой строки?

Так как S представляет собой буфер (не один символ), для первого цикла метод сравнения может быть изменен на

while ((c > 0) && (strstr(s, "\r\n") == NULL)); 

Для того, чтобы требовать как «\ г» & «\ п» есть. Это использует поиск строк для проверки того, что оба значения присутствуют в одной строке.

в результате:

do { 
    c = recv(gfr->client_fd, s, slen, 0); 
    printf("checking to see what s has now: %s\n", s); 
    // count += c; //not needed 
} while ((c > 0) && (strstr(s, "\r\n") == NULL)); 

Если вы решили захватить линию, которая имеет все 4, то есть \r\n\r\n, а затем сделать что аргумент сравнения.

Одностороннее примечание, если вы не задали параметры сокета для неблокирования, recv() является блокирующим вызовом. Посмотрите в how to set a socket to non-blocking

+0

У меня была длина, которую нужно было читать как 1 байт, но понимал, что на каждой итерации буфер будет переопределен. Я добавил неблокирование к сокету дескриптора файла клиента (client_fd) при создании, и я использую условие в вашем цикле, но просто с «\ r \ n \ r \ n» в соответствии с нашим протоколом. – leroneb

+0

@leroneb - Вы не указали явно, ... это работает? – ryyker