← →
vadim1 ©
(2006-03-23 05:08)
[0]
Господа! Доброго Вам времени суток!
Заранее прошу прошения за дилетантский вопрос — но уж очень меня с ним «припекло»
Использую на 2-х компах ServerSocket и ClientSocket соответственно
Все плпытки установить соединение заканчиваются ошибкой «Asynchronous socket error 10061». Сколько я ни игрался с портами — результат отсутствовал Но стоило мне заменить программы установленные на компах на простенькие примерчики из Help — всё заработало на славу!
В коде бегущем на обоих компах имеется только по одному (!) элементу ClientSocket и ServerSocket и по одному-единственному обращению к ним При этом сам код этих обращений точно такой же как в упомянутых примерах
Что может явится причиной столь удручающего поведения ?
Буду очень признателен за любую помощь
← →
Сергей М. ©
(2006-03-23 08:06)
[1]
Приведи свой вариант неработающего кода
← →
vadim14
(2006-03-23 10:32)
[2]
Сервер:
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Port := 1001;//чёрт знает ,сколько портов перепробовал!
ServerSocket1.Active := TRUE;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Edit1.Text := Socket.ReceiveText;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
end;
Клиент:
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1.Port := 23;
ClientSocket1.Host := «192.168.1.5; //испробовал и имя Хоста тоже!
ClientSocket1.Active := true;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Active := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if ClientSocket1.Active then
ClientSocket1.Socket.SendText(Edit1.Text);
end;
Казалось бы : куда уж проще?! Так вот — в чистом виде пример работает а как «довесок» к программе в которой повторяю других операций с сетью нет — НИ ВКАКАКУЮ !
← →
vadim14
(2006-03-23 10:38)
[3]
Sorry! Что-то я с никами запутался! Был Vadim1 а стал почему-то Vadim14!
← →
Сергей М. ©
(2006-03-23 11:06)
[4]
> ClientSocket1.Port := 23;
Почему 23-то, когда сервер на самом деле слушает на 1001-м порту ?
Св-во Port и у клиента и у сервера д.б. одинаково !
← →
vadim14
(2006-03-23 12:17)
[5]
Это опечатка! На самом деле в коде установки правильные,просто перед тем как послать вопрос я очередной раз их пытался менять и меня отвлекли! Прошу прощшения,однако проблема,к сожалению,не в этом…
← →
Сергей М. ©
(2006-03-23 12:42)
[6]
> vadim14 (23.03.06 12:17) [5]
Ошибка с кодом 10061 может возникнуть
только
в случае, если хост доступен, но целевой порт на нем не активен (не открыт).
← →
Сергей М. ©
(2006-03-23 12:43)
[7]
Либо если сервер отверг попытку подключения клиента, но это не твой случай.
← →
vadim14
(2006-03-23 13:02)
[8]
«Ошибка с кодом 10061 может возникнуть только в случае, если хост доступен, но целевой порт на нем не активен (не открыт).»
Так я же перепробовал штук 10 разных портов!
И потом в программе я больше нигде к сети не обращаюсь — то есть вроде как «забивать» порты нечем…
← →
Сергей М. ©
(2006-03-23 13:19)
[9]
> Так я же перепробовал штук 10 разных портов!
Да хоть 10 000 !
Еще раз повторяю : ошибку с кодом 10061 может вернуть только операция коннекта (читай описание кодов отказа ф-ции connect в справке MS WinSock2 Reference или в MSDN), и связана она именно с вышеуказанными условиями !
Ты может св-во Service где-то назначил у сервера или у клиента ?
← →
Сергей М. ©
(2006-03-23 13:26)
[10]
> «забивать» порты
Да и что значит «забивать» ?
← →
vadim14
(2006-03-23 15:57)
[11]
«Ты может св-во Service где-то назначил у сервера или у клиента «
Да нет
«Да и что значит «забивать» ?»
Ну то есть никто их больше не использует!
← →
Сергей М. ©
(2006-03-23 16:09)
[12]
> Ну то есть никто их больше не использует
Если бы их кто-то еще использовал, попытка установить св-во ServerSocket.Active привела бы к исключению.
Раз исключения не было, значит сервер был успешно активизирован на таком-то порту.
Попробуй активировать сервер и подключиться к нему средствами стандартной telnet-консоли:
telnet open 192.168.1.5 номер_того_самого_порта
Успешное подключение в этом случае говорит о «кривизне» твоего клиента.
← →
vadim1 ©
(2006-03-23 23:08)
[13]
Telnet не работает,но зато приведённый пример (без собственно программы) отлично «контачит»…
← →
Сергей М. ©
(2006-03-24 08:17)
[14]
> приведённый пример (без собственно программы) отлично «контачит».
Ничего не понял ..
Какой такой «приведенный пример .. контачит» ? Который в [2] ?
Но ты же сам говоришь что он «не контачит» ?
Что за «собственно программа» ?
«Приведенный пример» — это что, не программа ? А что же тогда это ?!
← →
vadim1 ©
(2006-03-25 21:37)
[15]
Спасибо за помощь! Я уже разобрался! В программе присутствовал фрагмент который просто перегружал несчатный комп а сеть как раз и послужила индикатором
!
А приведённый код — всего лишь маленькая добавка к этой самой самой проге,коя (добавка ) отлично работала — но только сама по себе :)))
Ещё раз большое спасибо!
Как, при подключении клиента, если сервер не запущен, отловить системную ошибку и выдать сообщение о недоступности сервера? Перерыр гугл, но конструкция Try..Except не работает, как и Try..Except on E:Exception do. Или как проверить доступность сервера тогда? Код, который использовал, ниже: (событие об ошибке работает, но и системная ошибка также выдается, что логично)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//клик на кнопку
procedure TForm1.Button1Click(Sender: TObject);
begin
Try
ClientSocket1.Open;
Except
On E : Exception do Label1.Caption:='Ошибка подключения';
End;
end;
//при ошибке
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket:TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
begin Label1.Caption:='Ошибка';end;
end.
|
|
|
Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.
Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.
Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Полезные ссылки: MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь: Krid,
Rouse_
Опять TClientSocket и Asynchronous socket error 10061
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Пишу клиент мелкий но надо использовать потоковые функции Надо обойти ненавистную ошибку ?когда к серверу не может достучаться Всегда помогало type=ctNonBlocking, обработчик в OnError и в конце ErrorCode:=0 но в этот раз надо писать и читать не с помощью onRead,onWrite,а стримами и соответственно type=ctNonBlocking нельзя Так вот как бы не выставлял ErrorCode:=0 все равно выскакиевает ошибка во время работы программы:( Уважаемые гуру, прошу помощи использую Delphi 2007 |
Oleg2004 |
|
Вообще то эта ошибка как бы к коду не относится Цитата WSAECONNREFUSED (10061) В подключении отказано – на хосте партнера не |
medved_68 |
|
Цитата Oleg2004 @ Вообще то эта ошибка как бы к коду не относится :
Почему? Очень даже относится. Если бы он не активировал сокет — то и такой ошибки бы не было!!! Цитата начинающий @ но в этот раз надо писать и читать не с помощью onRead,onWrite,а стримами и соответственно type=ctNonBlocking нельзя
Рекомендую посмотреть в сторону TWinSocketStream, а чтобы ошибка при коннекте не «вылазила» (если сервер не активен) — все операции на сокете заключить в блок try…except, где в секции except вызовом WSAGetLastError узнавать код ошибки, вызвавшей исключение, подавлять ее и выдавать пользователю свое сообщение (при необходимости) или предпринимать какие то другие действия. |
Oleg2004 |
|
Цитата medved_68 @ Почему? Очень даже относится.
Я бы не был столь категоричным |
medved_68 |
|
Цитата Oleg2004 @ Это ошибка на стороне партнера по сети — а не в программе Цитата Oleg2004 @ и от типа сокета, на котором работает соединение, она категорически не зависит
Спорить было бы глупо. Цитата Oleg2004 @ Я бы не был столь категоричным Цитата medved_68 @ Почему? Очень даже относится. Если бы он не активировал сокет — то и такой ошибки бы не было!!!
Сообщение отредактировано: medved_68 — |
начинающий |
|
спасибо, обыграл ситуацию с try … except … что-то типа такого Client.Address:=ServerIpCombo.Text; ServerConnection:=0; i:=0; while ((ServerConnection<>1) and (i<20)) do begin try Client.Open; ServerConnection:=1; except on Exception do begin ServerConnection:=-1; inc(i); Sleep(200); Application.ProcessMessages; end; end; end; if (ServerConnection<>1) then begin MemoLog.Lines.Add(‘No server connection’); Exit; end; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0244 ] [ 16 queries used ] [ Generated: 21.09.23, 09:55 GMT ]
Для программистов, которые работают с сокетами, сталкиваться с ошибками, связанными с асинхронным оперированием с ними, достаточно часто. Одним из таких сообщений об ошибках является Asynchronous socket error 10061 Delphi. В данном материале мы разберемся, почему возникает данная ошибка и как ее можно исправить.
Asynchronous socket error 10061 Delphi: что это за ошибка?
Asynchronous socket error 10061 Delphi – это сообщение об ошибке, которое появляется, когда приложение не может установить соединение с удаленным хостом. Как правило, данная ошибка появляется при работе с сокетами в режиме клиент-сервер, когда клиент не может подключиться к серверу.
Причины возникновения ошибки
Существует несколько причин, почему при работе с сокетами в Delphi может возникнуть ошибка Asynchronous socket error 10061. Рассмотрим их подробнее.
1. Неправильно указан адрес сервера
Одной из основных причин, почему не удается подключиться к серверу, является ошибочно указанный IP-адрес или порт сервера. Если IP-адрес указан неверно, сокет не сможет установить соединение с сервером. Кроме того, если порт сервера занят или указан неверно, то также может появиться ошибка Asynchronous socket error 10061 Delphi.
2. Не открыты права на доступ к порту
Другой причиной ошибки может стать отсутствие доступа к порту. Если у пользователя нет прав на доступ к порту, то сокет не сможет установить соединение с сервером и появится Asynchronous socket error 10061.
3. Неправильно настроен процесс подключения
В некоторых случаях ошибка может появляться из-за неправильно настроенного процесса подключения. Например, если клиент отправляет запрос на подключение к серверу, но не ожидает ответа от сервера, то он будет продолжать пытаться подключиться, несмотря на наличие ошибки.
Решение проблемы
Чтобы решить проблему с Asynchronous socket error 10061 Delphi, необходимо выполнить несколько действий.
1. Проверить правильность указания IP-адреса и порта сервера
Если сокет не может подключиться к серверу, то первым делом необходимо убедиться, что IP-адрес и порт указаны верно. Если ошибки нет, то следует проверить, не занят ли порт сервером.
2. Убедиться, что права на доступ к порту открыты
Если IP-адрес и порт указаны верно, то можно проверить, открыты ли права на доступ к порту. Для этого необходимо выполнить команду в командной строке:
netstat -a
Если порт открыт, то будет выведен список соединений. Если порт закрыт, то следует проверить настройки защиты и правильность работы брандмауэра.
3. Проверить настройки процесса подключения
Если причина ошибки связана с неправильно настроенным процессом подключения, то необходимо убедиться, что клиент ожидает ответа от сервера на свой запрос на подключение.
Вывод
Asynchronous socket error 10061 Delphi – это довольно распространенная ошибка, которая появляется при работе с сокетами в режиме клиент-сервер. Чтобы избежать данной ошибки, необходимо правильно указать IP-адрес и порт сервера, открыть доступ к порту и правильно настроить процесс подключения. Если все настройки приведены в порядок, то ошибка должна исчезнуть и приложение должно успешно установить соединение с сервером.
deeller 39 / 39 / 4 Регистрация: 20.04.2011 Сообщений: 789 Записей в блоге: 1 |
||||
1 |
||||
02.09.2011, 16:58. Показов 9108. Ответов 4 Метки нет (Все метки)
есть вот две процедурки позволяющие «прозвонить» сервер и записать логи, собсно по логике вещей пр недоступности порта у конкретного сервера должна внестись соответствующая запись,а на деле выскакивает ошибка socket error 10061 подскажит в чем может быть дело?
0 |
Фрилансер 5845 / 1226 / 499 Регистрация: 23.11.2010 Сообщений: 3,375 Записей в блоге: 1 |
|
02.09.2011, 20:41 |
2 |
Фаерволы отключены?
0 |
Добрый самаритянин 1107 / 622 / 139 Регистрация: 31.03.2009 Сообщений: 2,567 |
|
02.09.2011, 20:43 |
3 |
Будьте добры выложите полный текст ошибки.
0 |
3070 / 1408 / 425 Регистрация: 19.01.2009 Сообщений: 3,861 |
|
03.09.2011, 01:01 |
4 |
Будьте добры выложите полный текст ошибки. John_Pa9JIbHuK, это же WSAECONNREFUSED «Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение» .
1 |
39 / 39 / 4 Регистрация: 20.04.2011 Сообщений: 789 Записей в блоге: 1 |
|
07.09.2011, 10:54 [ТС] |
5 |
прошу прощения трабл был в фаерволе
0 |