На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > чтение данных recv
      Помогите разобраться
      Что будет происходить в следующих ситуациях
      1) Клиент посылает send'ом пакет определенного размера, пусть это будет 100 байт. Во входной очереди принимающей стороны появляются данные, но не все, recv считывает 60 байт и ждет остальное. Что делать если данные приходят в произвольном порядке
      2) Если размер буфера, в который recv читает данные меньше чем размер данных, находящихся в очереди, что будет с теми данными которые recv не считал , они удалятся из очереди или их можно будет считать в следующий раз

      Добавлено
      и еще
      если в очереди находится несколько пакетов и размер буфера, в который recv считывает данные такой что, в него можно считать
      все данные очереди, что считает recv - только один пакет или всю очередь?
        машина1_юзер_буфер ---- машина1_систем_буфер ----- машина2_систем_буфер ---- машина2_юзер буфер

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

        Представь себе соединение как трубу в которую на одном конце наливают воду. На другом конце вода идет попорядку, без разделения на то что 1л налили час назад а еще 2л добавили 15 мин назад. Она там просто есть. recv за один присест считает минимум(сколько даных есть, размер юзер буфера).
          все понятно, спасибо, буду пробовать
            а как быть в такой ситуации: я использую класс CSocket , при посылке данных на сервер связь пропадает, появляется ошибка SOCKET_ERROR. Как в таком случае освободить память, выделенную malloc. уменя выдает ошибку доступа к данным
            ExpandedWrap disabled
                  PCHAR pBuf = (PCHAR)malloc(nInBufferSize+sizeof(STitleMessage));
                  ((STitleMessage*)pBuf)->nTitle = TITLE_CODE;
                  ((STitleMessage*)pBuf)->nCommand = dwIoControlCode;
                  ((STitleMessage*)pBuf)->nSizeIn =   nInBufferSize;
                  ((STitleMessage*)pBuf)->nSizeOut = nOutBufferSize;
                  if(nInBufferSize)memcpy(&pBuf[sizeof(STitleMessage)],lpInBuffer,nInBufferSize);
                  //отправляем данные
                  if ( m_pSocket->Send(pBuf,nInBufferSize+sizeof(STitleMessage)) == SOCKET_ERROR )
                  {
                  //  TRACE(" Error %d /n",m_pSocket->GetLastError());
                      TCHAR szBuf[80];
                      LPVOID lpMsgBuf;
                      DWORD dw = m_pSocket->GetLastError();
               
                      FormatMessage(
                          FORMAT_MESSAGE_ALLOCATE_BUFFER |
                          FORMAT_MESSAGE_FROM_SYSTEM,
                          NULL,
                          dw,
                          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                          (LPTSTR) &lpMsgBuf,
                          0, NULL );
               
                      wsprintf(szBuf, " failed with error %d: %s", dw, lpMsgBuf);
                      //TRACE
                      //MessageBox(NULL, szBuf, "Error", MB_OK);
                      TRACE(szBuf);
                      LocalFree(lpMsgBuf);
               
                      free(pBuf);
                      return FALSE;
                  
                  }
              что за STitleMesssage ? в szBuff влазит сообщение об ошибке?
                ExpandedWrap disabled
                  typedef struct __TitleMessage__ {
                      ULONG nTitle;
                      ULONG nSizeIn;
                      ULONG nSizeOut;
                      ULONG nCommand;
                  } STitleMessage;

                с szBuf все в порядке, программа валится именно на строчке free(pBuf)
                  ;) буфер увеличь
                  ExpandedWrap disabled
                    TCHAR szBuf[512];
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0225 ]   [ 16 queries used ]   [ Generated: 28.04.24, 05:14 GMT ]