Эх.. молодеж .... полный код я тебе не дам(облом в сорцах рытся), но если клиент не смог подключится, то он возвращает ошибку WSACONNREFUSED
Вот ниже представляю тебе код, для тестирования ошибок, которые могу происходить во время работы библиотеки висок...
| Код | procedure TestWinSockError; var iErr:integer; sFullErr:string; begin sFullErr:='Неизвестная ошибка'; iErr:=WSAGetLastError; case iErr of WSASYSNOTREADY:sFullErr:='Основная сетевая подсистема не готова к запуску'; WSAVERNOTSUPPORTED:sFullErr:='Версия библиотеки не поддерживается'; WSAEFAULT:sFullErr:='Превышен предел поддерживаемых ОС задач'; WSAEINPROGRESS:sFullErr:='Выполняется операция в блокирующем режиме, необходимо дождаться её окончания'; WSANOTINITIALISED:sFullErr:='Сначала надо инициализировать WinSock'; WSAENETDOWN:sFullErr:='Связь нарушена. Возможно было утеряно соединение с интернетом'; WSAEAFNOSUPPORT:sFullErr:='Запрашиваемая адресация (значение параметра af) не поддерживается'; WSAEMFILE:sFullErr:='Ресурс доступных дескрипторов исчерпан'; WSAENOBUFS:sFullErr:='Недостаточно памяти буфера и сокет не может быть создан'; WSAEPROTONOSUPPORT:sFullErr:='Протокол не поддерживатся'; WSAEPROTOTYPE:sFullErr:='Неверный тип спецификации (параметр type) для выбранного протокола'; WSAESOCKTNOSUPPORT:sFullErr:='Указанный тип сокета не поддерживается заданной адресацией'; WSAEINVAL:SFullErr:='Сокет уже связан с адресом или не был связан'; WSAENOTSOCK:sFullErr:='Неверный дескриптор сокета'; WSAEISCONN:sFullErr:='Сокет уже подключен'; WSAHOST_NOT_FOUND:sFullErr:='Ответа от компьютера с таким адрессом нет'; WSATRY_AGAIN:sFullErr:='Ошибка сервера. Попроробуйте еще раз повторить попытку'; WSANO_RECOVERY:sFullErr:='Появилась ошибка которую нельзя устранить'; WSANO_DATA:SFullErr:='Имя существует, но нет записи нужного типа'; WSAEINTR:sFullErr:='Функцией WSACancelBlokingCall отменен блокирующий вызов'; WSAEALREADY:sFullErr:='Указанный сокет занят неблокирующей оперцией'; WSAENETUNREACH:SFullErr:='Сеть недоступна в данный момент'; WSAETIMEDOUT:sFullErr:='Исчерпано время ожидания от сервера. Повторите операцию через некоторое время'; WSAECONNREFUSED:sFullErr:='Сервер отклонил подключение или он не прослушивает этот порт'; WSAEWOULDBLOCK:sFullErr:='Сокет создан как неблокирующий, и в данный момент операция не может ыбть завершена'; WSAEACCES:SFullErr:='Попытка соединеня пакетным сокетом к широковещательному адрессу невозможна, потому что не включен параметр SO_BROADCAST'; WSAESHUTDOWN:sFullErr:='Сокет закрыт'; SD_RECEIVE:SFullErr:='0'; end; Application.MessageBox(PChar(sFullErr),'Внимание!!!'); end;
|
В тех местах где может происходить ошибка вызываю эту процедуру... Например так| Код | var Sock:TSocket; ............. sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if sock<>0 then TestWinSockError;
|
Ну или же допустим при отправке\инициализации и т.д.
Эта процедура всегда возвратит тебе код ошибки... конечно-же эта процедура не полная и не идеальная, но содержит основные ошибки(на моё усмотрение), которые могут возникать при работе с сокетами...
Цитата(Алкоголик @ 22.2.2008, 06:38 ) | | И еще просьба дайте код, как избавиться от ошибки, которая возникает на клиенте, когда он неможет соединьться с сервером. |
Избавится от ошибки ты просто так не сможеш, ошибки ведь разные бывают Переделай мою процедуру так, чтобы она не показывала ошибку, а исправляла её Допустим если возникла ошибка WSANOTINITIALISED, то никто не мешает внести в case такой код | Код | WSAStartup(MAKEWORD(1,1),WSAData);
|
Удачи.... |