Форум: "Сети";
Текущий архив: 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