Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.152.242] |
|
Сообщ.
#1
,
|
|
|
Помогите разобраться
Что будет происходить в следующих ситуациях 1) Клиент посылает send'ом пакет определенного размера, пусть это будет 100 байт. Во входной очереди принимающей стороны появляются данные, но не все, recv считывает 60 байт и ждет остальное. Что делать если данные приходят в произвольном порядке 2) Если размер буфера, в который recv читает данные меньше чем размер данных, находящихся в очереди, что будет с теми данными которые recv не считал , они удалятся из очереди или их можно будет считать в следующий раз Добавлено и еще если в очереди находится несколько пакетов и размер буфера, в который recv считывает данные такой что, в него можно считать все данные очереди, что считает recv - только один пакет или всю очередь? |
Сообщ.
#2
,
|
|
|
машина1_юзер_буфер ---- машина1_систем_буфер ----- машина2_систем_буфер ---- машина2_юзер буфер
Если размер юзер буфера меньше пришедшего пакета, ничего страшного, они в систем буфере. Даные в систем буфере не будут в произвольно порядке, об этом беспокоится система. Представь себе соединение как трубу в которую на одном конце наливают воду. На другом конце вода идет попорядку, без разделения на то что 1л налили час назад а еще 2л добавили 15 мин назад. Она там просто есть. recv за один присест считает минимум(сколько даных есть, размер юзер буфера). |
Сообщ.
#3
,
|
|
|
все понятно, спасибо, буду пробовать
|
Сообщ.
#4
,
|
|
|
а как быть в такой ситуации: я использую класс CSocket , при посылке данных на сервер связь пропадает, появляется ошибка SOCKET_ERROR. Как в таком случае освободить память, выделенную malloc. уменя выдает ошибку доступа к данным
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; } |
Сообщ.
#5
,
|
|
|
что за STitleMesssage ? в szBuff влазит сообщение об ошибке?
|
Сообщ.
#6
,
|
|
|
typedef struct __TitleMessage__ { ULONG nTitle; ULONG nSizeIn; ULONG nSizeOut; ULONG nCommand; } STitleMessage; с szBuf все в порядке, программа валится именно на строчке free(pBuf) |
Сообщ.
#7
,
|
|
|
буфер увеличь
TCHAR szBuf[512]; |