Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Вниз

Проблема с сокетами   Найти похожие ветки 

 
kalishenko stas   (2002-11-14 15:03) [0]

Уважаемые Мастера! Никак не получается правильно работать с сокетами. Обрабатывая ClientSocket1Error и ServerSocket1ClientError, а именно ErrorCode:=0, оно мне вновь и вновь выдает ошибку класса ESocketError [10049],т.е. как мне написали, "нет такого адреса". Тогда дело в моем коде. Если не тяжело, просмотрите, че не так.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Allmess.Lines.Add("From "+Socket.RemoteHost + ": "+Socket.ReceiveText);// Allmess - поле Memo для всех сообщений
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Allmess.Text:="";
a:=""; // глоб. перем. а - имя машины, приемника сообщения
ShownOnce:= true;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with ClientSocket1 do begin
try
if not Active then
Host:=a
else ShowMessage("Сокет активен");

try
Open;
// while not ClientSocket1.Active do Application.ProcessMessages;
if Socket.SendText(Mess.Text)>0 then
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
finally
Close;
end;
except
on ESocketError do ShowMessage("Не могу подключиться");
end;
end;
end;


procedure TForm1.ClientsClick(Sender: TObject);
begin
a:="";
a:=Clients.Items[Clients.ItemIndex]; // Clients - ListBox с машинами в сети
ShowMessage(a);
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if not ClientSocket1.Active then
ShowMessage("Абонент находится вне зоны обслуживания");
ErrorCode:=0;
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;


 
Dimich1978   (2002-11-14 16:34) [1]

Попробуй дописать вот такой код....умные люди подсказалив свое время.
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
ErrorCode:= 0;
end;


 
kalishenko stas   (2002-11-14 18:03) [2]

Не помогает. Есть еще какие-нибудь мысли?


 
autoBUS   (2002-11-14 23:49) [3]

try
Open;
{ Здесь зря закомментировал }
// while not ClientSocket1.Active do Application.ProcessMessages;
{ Вот здесь добавляем }
if ClientSocket1.Active then
{ И порядочек !!! }
if Socket.SendText(Mess.Text)> -1 then
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
finally
Close;
end;


 
Fredericco   (2002-11-15 12:53) [4]

Попробуй не ErrorCode:=0; а Abort;


 
Digitman   (2002-11-15 13:21) [5]

WSAEADDRNOTAVAIL

(10049)

Cannot assign requested address.

The requested address is not valid in its context. Normally results from an attempt to bind to an address that is not valid for the local machine, or connect/sendto an address or port that is not valid for a remote machine (e.g. port 0).


 
kalishenko stas   (2002-11-15 14:18) [6]

>>Digitman

Это значит, что или адреса такого нет, или порт не настроен?


 
Digitman   (2002-11-15 14:22) [7]

Это значит - адрес недоступен. До порта даже дело не доходит.


 
kalishenko stas   (2002-11-15 14:48) [8]

>>Digitman

Хорошо, с этим вроде все понятно. Но теперь другой прикол. В коде отправки сообщения, вставляя после открытия сокета while not ClientSocket1.Active do Application.ProcessMessages, сообщение есс-но отсылается, однако приложение работает до тех пор, пока я не смогу подключиться к какой-либо другой машине, т.е. на ней это приложение не запущено. После неудачного подключения мое приложение выдает "Абонент находится вне зоны обслуживания" и закрыть его (приложение) никак не удается. Но, если убрать while not ClientSocket1.Active do Application.ProcessMessages все работает почти нормально, т.е. его уже можно закрыть, но отправляет сообщение самой себе (для проверки программы) лишь со второй попытки, т.е. не успевает открыть сокет. Что делать?

Вот сама процедура:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with ClientSocket1 do begin
if not Active then
Host:=a
else ShowMessage("Сокет активен");
try
Open;
// while not ClientSocket1.Active do Application.ProcessMessages; - все по-моему в этой строке, а чем ее заменить?
if Active then begin
if Socket.SendText(Mess.Text)>0 then
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
end;
finally
Close;
end;
end;
end;


 
Digitman   (2002-11-15 15:01) [9]

Тебе чего надо сделать-то ? В случае успешного установления соединения отправить сообщение ?

Ну так и отправляй его в событии OnWrite !


 
kalishenko stas   (2002-11-15 15:17) [10]

Вот так, что-ли:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with ClientSocket1 do begin
if not Active then
Host:=a
else ShowMessage("Сокет активен");
try
Open;
// while not ClientSocket1.Active do Application.ProcessMessages; - все по-моему в этой строке, а чем ее заменить?
if Active then OnWrite(Sender);
finally
Close;
end;
end;
end;

procedure TForm1.ClientSocket1OnWrite(Sender: TObject);
begin

end;


 
kalishenko stas   (2002-11-15 15:19) [11]

Вот так, что-ли:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with ClientSocket1 do begin
if not Active then
Host:=a
else ShowMessage("Сокет активен");
try
Open;
// while not ClientSocket1.Active do Application.ProcessMessages; - все по-моему в этой строке, а чем ее заменить?
if Active then OnWrite(Sender);
finally
Close;
end;
end;
end;

procedure TForm1.ClientSocket1OnWrite(Sender: TObject);
begin
if Active then begin
if Socket.SendText(Mess.Text)>0 then
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
end;
end;


 
Digitman   (2002-11-15 15:36) [12]

var
MyText : string;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MyText := "Чего-то там";
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1OnWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText(MyText);
end;


 
kalishenko stas   (2002-11-15 16:44) [13]

Всем спасибо! Вроде получилось (пока).



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
8-37220
MadCoder
2002-09-25 15:01
2003.01.13
Вывод многоцветной картинки в DXDraw


14-37330
Дмитрий К.К.
2002-12-24 06:18
2003.01.13
Именинники 24 декабря


3-36991
Rust1970
2002-12-17 15:26
2003.01.13
как через ADO вызвать хрпроцедуру, которая пишет в BLOB (oracle)


1-37103
race1
2003-01-04 10:59
2003.01.13
имена


14-37279
Гогия
2002-12-24 17:59
2003.01.13
Вместо елки-новогодний букет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский