Здравствуйте!
Вот код сервера
здесь
Столько времени убил на то чтобы найти ошибку, но все равно никак не могу.
Функция WSARecv все время возвращает SOCKET_ERROR + WSA_IO_PENDING.
GetQueuedCompletionStatus() возвращаем CompletionKey и Overlapped структуру. Все типа хорошо. Каждый Recv ловится нормально, но с ошибкой SOCKET_ERROR + WSA_IO_PENDING.
Я все перерыл, но безуспешно. Не могу понять когда операция завершится, все время PENDING

.
Может кто подскажет, где баг зарыт. Чувствую, что где-то лажу сделал

.
Спасибо!!!
Здравствуйте, Panerox, Вы писали:
P>Здравствуйте!
P>Вот код сервера здесь
P>Столько времени убил на то чтобы найти ошибку, но все равно никак не могу.
P>Функция WSARecv все время возвращает SOCKET_ERROR + WSA_IO_PENDING.
P>GetQueuedCompletionStatus() возвращаем CompletionKey и Overlapped структуру. Все типа хорошо. Каждый Recv ловится нормально, но с ошибкой SOCKET_ERROR + WSA_IO_PENDING.
P>Я все перерыл, но безуспешно. Не могу понять когда операция завершится, все время PENDING
.
P>Может кто подскажет, где баг зарыт. Чувствую, что где-то лажу сделал
.
P>Спасибо!!!
Так а нет бага.
WSARecv вам гвоорит сколько было прочтено, естевенно все прочесть наверно не смогло, потому SOCKET_ERROR WSA_IO_PENDING — просто напоминание вам что считано не все что вы спрашивали.
На всяк случае напомню.
Посему нужно самому следить за указателем записи, тоесть к примеру если у вас есть буфер на 1Килобайт, а после чтения функция чтения вернула вам 100, то следующе обращение к функции нужно будет делать с параметрами — ячейка памяти буфера смещенная на 100 и 1024 — 100 байт.
Здравствуйте, Panerox, Вы писали:
Michael Chelnokov прав. Почитай немного поподробней про порт и работу с ним.
Ссылки на статьи в
этомАвтор: Detsel
Дата: 13.09.06
посте.
V>Так а нет бага.
V>WSARecv вам гвоорит сколько было прочтено, естевенно все прочесть наверно не смогло, потому SOCKET_ERROR WSA_IO_PENDING — просто напоминание вам что считано не все что вы спрашивали.
V>На всяк случае напомню.
V>Посему нужно самому следить за указателем записи, тоесть к примеру если у вас есть буфер на 1Килобайт, а после чтения функция чтения вернула вам 100, то следующе обращение к функции нужно будет делать с параметрами — ячейка памяти буфера смещенная на 100 и 1024 — 100 байт.
nRecvResult = WSARecv(sClient->scSocket,
&(sClientOverlapped->scDataBuf),
1,
&dwBytes,
&dwFlags,
&(sClientOverlapped->scOverlapped),
NULL);
>>>к примеру если у вас есть буфер на 1Килобайт, а после чтения функция чтения вернула вам 100
В моем случае я отправляю 64 байта, а функция возвращает, что считано
0 и так всегда. Если бы она вернула что считана часть, я бы считал следующую часть и так до конца. Но она возващает всегда 0, вот тут и загвоздка. Я не могу узнать сколько прочитано.
Статьи я почитал и сделал все как было написано, может конечно, что и не понял. Помоги те разъяснить пожалуйста.
Здравствуйте, Panerox, Вы писали:
V>>Так а нет бага.
V>>WSARecv вам гвоорит сколько было прочтено, естевенно все прочесть наверно не смогло, потому SOCKET_ERROR WSA_IO_PENDING — просто напоминание вам что считано не все что вы спрашивали.
V>>На всяк случае напомню.
V>>Посему нужно самому следить за указателем записи, тоесть к примеру если у вас есть буфер на 1Килобайт, а после чтения функция чтения вернула вам 100, то следующе обращение к функции нужно будет делать с параметрами — ячейка памяти буфера смещенная на 100 и 1024 — 100 байт.
P> nRecvResult = WSARecv(sClient->scSocket,
P> &(sClientOverlapped->scDataBuf),
P> 1,
P> &dwBytes,
P> &dwFlags,
P> &(sClientOverlapped->scOverlapped),
P> NULL);
>>>>к примеру если у вас есть буфер на 1Килобайт, а после чтения функция чтения вернула вам 100
P>В моем случае я отправляю 64 байта, а функция возвращает, что считано 0 и так всегда. Если бы она вернула что считана часть, я бы считал следующую часть и так до конца. Но она возващает всегда 0, вот тут и загвоздка. Я не могу узнать сколько прочитано.
P>Статьи я почитал и сделал все как было написано, может конечно, что и не понял. Помоги те разъяснить пожалуйста.
Чесно сказать в код вникать лень. Да и время нет.
Могу посоветовать книгу Рихтера "Network Programming for Microsoft Windows", если есть желание вышлю на мыло, она на английском, на русском я так и не нашол ее.
Прочитав тему ИОСП в ней я понял что от меня хотят — вообще книга хорошая.
Здравствуйте, vasmann, Вы писали:
V>Здравствуйте, Michael Chelnokov, Вы писали:
MC>>Здравствуйте, vasmann, Вы писали:
V>>>Могу посоветовать книгу Рихтера "Network Programming for Microsoft Windows"
MC>>Если Рихтера, то скорее http://gzip.rsdn.ru/res/book/win32/programming_server_apps_w2k.xmlАвтор(ы): Джеффри Рихтер, Джейсон Кларк
В книге Джеффри Рихтера и Джейсон Кларка исчерпывающе описаны функции новой операционной системы
Microsoft — Windows 2000, позволяющие создавать высокопроизводительные и
надежные серверные приложения. Менеджер управления службами, контроль
производительности и системных событий, асинхронный ввод-вывод, система
безопасности и защищенное взаимодействие приложений обеспечат надежную и
эффективную работу ваших приложений в качестве служб операционной системы 24
часа в сутки 7 дней в неделю. Все главы содержат примеры, написанные на C++,
демонстрирующие описываемые технологии. Вы можете использовать в своих
приложениях фрагменты этих программ и готовые классы C++, исходные тексты
которых содержатся на прилагаемом компакт-диске. Книга состоит из 12 глав, 2
приложений и предметного указателя. Прилагаемый к книге компакт-диск содержит
программное обеспечение, примеры приложений, документацию и электронную версию
книги.
V>Да виноват
V>Все в голове попутал
V>а network programming это Anthony Jones and Jim Ohlund
Да усе разобрался я

. заново все переписал, почти все правильно делал, токо видно слглючило

не в ту сторону смотрел
Всем спасибо!!!!!