Здравствуйте, -Cheese-, Вы писали:
CX>> // Тут нужно особое внимание обратить на byte order. Если у тебя архитектура little-endian,
CX>> // а значение высылается в сетевом порядке байт, то ntohs обязательна
CX>> // short здесь в предположении что sizeof(short) == 2
C>приложение будет запускаться на 2000 винде
C>компилятор VC++
Важно не это, а то, в каком виде данные передает другая сторона.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Здравствуйте, CrystaX, если вы не против продолжим...:
CX>Нет, не так. Вот примерный код, как это должно выглядеть:
CX>CX>bool process_data(SOCKET sock)
CX>{
CX> int received = 0, required = 2;
CX> while((received = recv(sock, buf + received, required - received, 0)) > 0);
CX> if(received == SOCKET_ERROR) return false;
CX> // Тут нужно особое внимание обратить на byte order. Если у тебя архитектура little-endian,
CX> // а значение высылается в сетевом порядке байт, то ntohs обязательна
CX> // short здесь в предположении что sizeof(short) == 2
CX> short size = ntohs(*reinterpret_cast<short *>(buf));
CX> required = size;
CX> received = 0;
CX> while((received = recv(sock, buf + received, required - received, 0)) > 0);
CX> if(received == SOCKET_ERROR) return false;
CX> buf[size] = '\0';
CX> pushToStack(buf, size);
CX> return true;
CX>}
CX>
может я чего-то не понял, но по ходу функции в выделенном месте всегда получается, что received == SOCKET_ERROR
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Здравствуйте, -Cheese-, Вы писали:
C>может я чего-то не понял, но по ходу функции в выделенном месте всегда получается, что received == SOCKET_ERROR
Обрати внимание на ntohs. Быть может, ее вызов здесь не нужен. Могу предположить такую ситуацию: данные передаются в little-endian виде, а ntohs их переворачивает. Впоне может получиться ситуация с отрицательным size. Тогда возможно возвращение SOCKET_ERROR. Других причин не вижу. Хотя, конечно, это может быть и наведенная ошибка. Не могу гадать.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Здравствуйте, CrystaX, Вы писали:
CX>Обрати внимание на ntohs. Быть может, ее вызов здесь не нужен. Могу предположить такую ситуацию: данные передаются в little-endian виде, а ntohs их переворачивает. Впоне может получиться ситуация с отрицательным size. Тогда возможно возвращение SOCKET_ERROR. Других причин не вижу. Хотя, конечно, это может быть и наведенная ошибка. Не могу гадать.
размер совпадает с передаваемым сообщением, смотрел..
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Здравствуйте, -Cheese-, Вы писали:
C>Здравствуйте, CrystaX, Вы писали:
CX>>Обрати внимание на ntohs. Быть может, ее вызов здесь не нужен. Могу предположить такую ситуацию: данные передаются в little-endian виде, а ntohs их переворачивает. Впоне может получиться ситуация с отрицательным size. Тогда возможно возвращение SOCKET_ERROR. Других причин не вижу. Хотя, конечно, это может быть и наведенная ошибка. Не могу гадать.
C>размер совпадает с передаваемым сообщением, смотрел..
Ну тогда ищи, что еще сказать. Отладчик тебе в руки и вперед! А я не телепат. Угадать, что там происходит, не могу.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>