The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"RECV problema"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"RECV problema"  
Сообщение от 3bepb (ok) on 25-Янв-07, 13:40 
Здравствуйте дорогие товарищи программисты.
Проблема: Не принимаются данные в полном объёме с сервера при восылке ему сообщения такого рода

char buf1[] = "GET http://server/ HTTP/1.1\nHost: server\nUser-Agent: Mozilla/5.0\nAccept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\nAccept-Language: en-us,en;q=0.7,ru;q=0.3\nAccept-Encoding: gzip,deflate\nAccept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\n\n";
Сервер отвечает, но поток данных прерывается по непонятной мне причине, выглядит это примерно так

GET http://chittel.ru/ HTTP/1.1
Host: chat.chittel.ru
User-Agent: Mozilla/5.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.7,ru;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

-----------------------
HTTP/1.1 200 OK
Date: Thu, 25 Jan 2007 10:02:45 GMT
Server: Apache/2.0.52 (Lineox)
X-Powered-By: PHP/4.3.9
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=cp1251

20dd
<HTML>
<HEAD>
<TITLE> </TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<STYLE type="text/css">
<!--
img {
        border: none;
}
.tah10 {
        font-family: Tahoma;
        font-size: 10px;
        text-decoration: none;
        color: #000000;
}
.tah11 {
    font-family: Tahoma;
        font-size: 11px;
        tex

Вопрос: почему?

Вот кратко кусок кода который соеденяется с сервером, посылает и принимает данные

if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        printf("fuck socket re\n");
        return(-1);
    }

    if (connect(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
    {
        printf("fuck connect re\n");
        close(s);
        return(-1);
    }
    
    if (send(s, buf1/*core_temp->buf_r_c*/, sizeof(buf1)/*SIZE_BUFF_C*/, 0) < 0 )
    {
        printf("fuck send re\n");
        close(s);
        return(-1);
    }
    
    printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/);
    
    while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
    {
        printf("fuck recv re\n");
        close(s);
        return(-1);
    }

Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами.

Заранее благодарен.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

  • RECV problema, Michelnok, 15:39 , 25-Янв-07, (1)  
    • RECV problema, 3bepb, 17:21 , 25-Янв-07, (7)  
  • RECV problema, BigHo, 15:48 , 25-Янв-07, (2)  
    • RECV problema, 3bepb, 17:15 , 25-Янв-07, (6)  
  • RECV problema, BigHo, 16:01 , 25-Янв-07, (3)  
    • RECV problema, BigHo, 16:23 , 25-Янв-07, (4)  
      • RECV problema, 3bepb, 17:11 , 25-Янв-07, (5)  

Сообщения по теме [Сортировка по времени, UBB]


1. "RECV problema"  
Сообщение от Michelnok (ok) on 25-Янв-07, 15:39 
>while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
> {
>  printf("fuck recv re\n");
>  close(s);
>  return(-1);
> }

А что, по-твоему, должно происходить в этом цикле?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "RECV problema"  
Сообщение от 3bepb (??) on 25-Янв-07, 17:21 
>>while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
>> {
>>  printf("fuck recv re\n");
>>  close(s);
>>  return(-1);
>> }
>
>А что, по-твоему, должно происходить в этом цикле?

Соглашусь несколько грубо, применил в самом начале разработки особо не задумываясь.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "RECV problema"  
Сообщение от BigHo on 25-Янв-07, 15:48 
>HTTP/1.1 200 OK
>Date: Thu, 25 Jan 2007 10:02:45 GMT
>Server: Apache/2.0.52 (Lineox)
>X-Powered-By: PHP/4.3.9
>Connection: close
>Transfer-Encoding: chunked
>Content-Type: text/html; charset=cp1251
>
>20dd
><HTML>
><HEAD>

Супер ! По твоему поле "Transfer-Encoding: chunked" просто так выставлено ? Да и какие-то непонятные "20dd" в начале страницы должны были подтолкнуть тебя к правильному решению.

Вообщем это chunked-request. Данные высылаются порциями. В начале каждой порции используется строка, завершенная "\r\n", в которой указано, какое количество байт следует прочитать до следующей порции данных (естественно - в шестнадцатиричной форме). Данные в порции не должны анализироваться при приеме. Т.е. предполагается что данные передаются в бинарном виде, даже если указан "Context-Type: text/html".

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "RECV problema"  
Сообщение от 3bepb (??) on 25-Янв-07, 17:15 
>Супер ! По твоему поле "Transfer-Encoding: chunked" просто так выставлено ? Да
>и какие-то непонятные "20dd" в начале страницы должны были подтолкнуть тебя
>к правильному решению.
>
>Вообщем это chunked-request. Данные высылаются порциями. В начале каждой порции используется строка,
>завершенная "\r\n", в которой указано, какое количество байт следует прочитать до
>следующей порции данных (естественно - в шестнадцатиричной форме). Данные в порции
>не должны анализироваться при приеме. Т.е. предполагается что данные передаются в
>бинарном виде, даже если указан "Context-Type: text/html".

Но я пробовал операцию приема ставить в цикл, предполагая что могут быть порции, читал одни и теже данные, какое RFC описывает порядок приема(2068???) или другое?


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "RECV problema"  
Сообщение от BigHo on 25-Янв-07, 16:01 

>if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
> {
>  printf("fuck socket re\n");
>  return(-1);
> }
>
> if (connect(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
> {
>  printf("fuck connect re\n");
>  close(s);
>  return(-1);
> }
>
>    if (send(s, buf1/*core_temp->buf_r_c*/, sizeof(buf1)/*SIZE_BUFF_C*/, 0) < 0 )
> {
>  printf("fuck send re\n");
>  close(s);
>  return(-1);
> }
>
>    printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/);
>
>    while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
> {
>  printf("fuck recv re\n");
>  close(s);
>  return(-1);
> }
>
>Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью
>malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами.
>
>Заранее благодарен.


Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. Изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг
>  return(-1);
> }
>
>    printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/);
>
>    while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
> {
>  printf("fuck recv re\n");
>  close(s);
>  return(-1);
> }
>
>Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью
>malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами.
>
>Заранее благодарен.


Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. Изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг
>  return(-1);
> }
>
>    printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/);
>
>    while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0)
> {
>  printf("fuck recv re\n");
>  close(s);
>  return(-1);
> }
>
>Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью
>malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами.
>
>Заранее благодарен.


Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. По умолчаниюю обычно от 8 до 16К. Но для send границей пакета является сам пакет. Т.е. как системе захотелось или удобней было его передать, так она и сделала. Поэтому изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг MSG_WAITALL.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "RECV problema"  
Сообщение от BigHo on 25-Янв-07, 16:23 
я ни разу, ни разу, не повторяюсь, не повторяюсь :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "RECV problema"  
Сообщение от 3bepb (??) on 25-Янв-07, 17:11 
>я ни разу, ни разу, не повторяюсь, не повторяюсь :)
Понял спасибо всем, просто немного не с той стороны проблему смотрел, строго не судите, надеюсь не самый глупый вопрос...буду копать

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру