![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приём сообщений от сервера [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Andr-04 © (2006-07-31 15:12:00)Добрый день. Как обойтись без использования WSAAsyncSelect для отправления сообщений от сервера и их приёма КЛИЕНТОМ?
Andr-04 (2006-08-02 14:09:00) [61]Значение какой массив - динамический или статический не имеет.
> И еще неделю выяснять будем, что говорит при этом WSAGetLastError()
Не утрируйте! WSAGetLastError выдаёт 0, т.е. всё OK. А использовать готовые компоненты смысла нет - модуль пишу. Для чего - не скажу, потому что унижать будете! Вобщем, это не имеетзначения!
Сергей М. (2006-08-02 13:48:00) [62]
> если Send вызывать с buf[0], то она тоже вернёт (-1)
Угу .. И еще неделю выяснять будем, что говорит при этом WSAGetLastError()
И накой тут сдался дин.массив - одному тебе известно.
Сергей М. (2006-08-02 13:46:00) [63]Тебе вообще накой ляд Winsock потребовался ?
Чем готовые компоненты не устроили ?
Andr-04 (2006-08-02 13:43:00) [64]И с buf, и с buf[0], и с простой переменной типа Cardinal. Ещё пробовал использовать ioctlsocket(fSocket,FIONREAD,sz), после выполнения которой sz возвращает 0. Но Send работает без проблем! И ещё: если Send вызывать с buf[0], то она тоже вернёт (-1)!
Ketmar (2006-08-02 13:31:00) [65]> [21] Andr-04 (02.08.06 13:17)
тогда с чего делается send() с просто buf? и советую проверить, не используется ли buf ещё где-то таким же образом. просто buf даст указатель совсем не туда, куда buf[0].
Сергей М. (2006-08-02 13:28:00) [66]
> не понимаю почему она возникает
А нефиг манипулировать GetSockOpt(), если не понимаешь, что там происходит и почему.
Andr-04 (2006-08-02 13:17:00) [67]Да знаю я описание этой ошибки. Только не понимаю почему она возникает! Переменная ига описана как динамический массив (array of byte), размер которого устанавливется предварительно при помощи SetLength, где в качестве размера выступает fBufSize.
Сергей М. (2006-08-02 12:50:00) [68]WSAEFAULT (10014) The buf argument is not totally contained in a valid part of the user address space.
Andr-04 (2006-08-02 12:38:00) [69]Да, в блокирующем и работал. Но не было необходимости принимать сообщения от сервера!
А я тем временем упорно разбирал документацию и переводил часть кода на асинхронный режим. Короче, в приведённом мной коде в [5] WSAGetLastError выдаёт WSAEFAULT (10014).
Прошу извинить за всё написанное мной выше - постараюсь больше этого не делать: буду писать сюда только после достаточного чтения доки и не экономить время на этом! Ато отвечают тут быстро :-) Спасибо!
Ketmar (2006-08-01 18:54:00) [70]кстати, только что обратил внимание на дезинформацию в [5]: "я с сокетами всегда только в блокирующем режиме работал". после чего желание как-то помогать пропало вовсе -- не люблю лжецов.
Ketmar (2006-08-01 18:50:00) [71]>Andr-04 (01.08.06 15:55) [15]
ничего ты не понял. "понял" -- это не "и всё", а "потому что".
>Сергей М. © (01.08.06 16:53) [16]
тут, похоже, просто ждут, пока весь нужный текст из справки на русский переведут. вот ты в [13] начал, после чего в [15] честно признались. %-)
Сергей М. (2006-08-01 16:53:00) [72]
> Может ещё за одно что узнаю
Да, ты узнаешь что тебе не место в программинге, ибо ты либо туп, либо лентяй, либо и то и другое.
Ибо ты никак не прореагировал на WSAGetLastError.
Andr-04 (2006-08-01 15:55:00) [73]Я понял, что Listen не нужен и всё. А остальное всё оставил. Пока решил зрение напрягать. Может ещё за одно что узнаю, чем читать на английском описание каждой функции/процедуры.
Ketmar (2006-08-01 15:53:00) [74]а можно пояснить глубокий эзотерический смысл вызова getsockopt()? или это опять из серии "а я в справке новую функцию нарыл"?
далее. очень интересно, что такое buf, какого оно размера, и почему в одном месте просто buf, а в другом -- buf[0]?
ну и: что, таки, возвращает WSAGetLastError(), как справедливо поинтересовался Сергей М.?
Сергей М. (2006-08-01 15:03:00) [75]
> Andr-04 (01.08.06 14:52) [12]
Ну хорошо.
Предположим, огр.кучу док-ции в эл.виде действительно читать тяжело.
Но прочитать десяток-другой строк из справки к recv() вполне можно было !
Ведь там черным по белому написано (цитата из справки к recv):
Return Values
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError
Т.е. если ты получил -1, первоечто ты должен сделать - вызвать WSAGetLastError, получить код конкретнойошибки, проанализировать его и в зависимости от причин ветвить свой алгоритм.
Ты это сделал ?
Нет, не сделал.
Ну так а что же ты хочешь тогда ?!
Andr-04 (2006-08-01 14:52:00) [76]Читаю, читаю... Говорил же уже! Правда, глаза сильно устают - принтер старый сломался, а шестерёнок нигде нету. А на счёт Listen - я её убирал - при отладке заметил, что ответ от неё -1, но это проблему не решило.
Ketmar (2006-08-01 09:59:00) [77]>DiamondShark © (01.08.06 00:21) [7]
Дим, это технология "а вот сколько всяких функция й знаю". %-)
>Andr-04 (01.08.06 00:50) [8]
что характерно (ц), нужные ответы есть в справке, идущей вместе с Delphi. надо только не лениться читать и думать.
Сергей М. (2006-08-01 08:15:00) [78]
> Andr-04
В целм код ужасный.
Почитай book.itep.ru, разделы "Winsock" и "Протокол TCP", там есть красочная циклограмма, наглядно иллюстрирующая, какие ф-ции и в какой последовательности вызываются на стороне сервера и на стороне клиента и что при этом происходит в недрах протокола.
Сергей М. (2006-08-01 08:11:00) [79]
> Andr-04 (01.08.06 00:50) [8]
listen() никогдане используется на стороне клиента, это ф-ция сервера.
Andr-04 (2006-08-01 00:50:00) [80]Не ругайте сильно! Если бы я знал что писать, то не спрашивал бы. Я никогда не сталкивался с необходимостью принимать сообщения от сервера. И что в этом такого страшного? Всё бывает когда-то первый раз! Если вас раздражают подобные вопросы - не пишите ответы. Со своей стороны я тоже пытаюсь найти ответ - ищу справочную литературу. Так оказалось, что сначала ничего найти не удавалось, поэтому, ради экономии времени, и задал вопрос здесь. Но ответа найти пока не удалось.