![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с Client/ServerSocket [D6, WinXP]
Destroyer © (2004-08-19 00:44:00)Есть код для serversocket:
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=true;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active:=false;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var mes:string;
begin
edit1.text:=Socket.ReceiveText;
end;
и для clientsocket:
procedure TForm1.Button1Click(Sender: TObject);
var mes:string;
begin
ClientSocket1.Host:=Edit1.Text;
ClientSocket1.Active:=true;
mes:=edit2.Text;
ClientSocket1.Socket.SendText(mes);
ClientSocket1.Active:=false;
end;
На serversocket сообщение приходит только после второго нажатия button1. Почему? Можно ли это исправить?
P@$l-l0l-( (2004-10-08 18:17:00) [1]Скажите пожалуйста, как обработать Socket.Open; на предмет возникновения ошибки соединения? Ведь если коннектиться к несуществующему хосту, то вылетает ошибка:
Windows Socket error Этот хост неизвестен. Либо подскажите, что я неправильно делаю.
CSocket.Host:=Host.Text;
CSocket.Port:=StrToInt(Port.Text);
CSocket.Open;
beatles_bntu (2004-08-26 00:41:00) [2]М да встречался я с этим глюком просто активизацию сокета и посылание сообшения делай в разных скажем так методах т.е. например при создании формы сразу запускай сокет а при нажатии кнопки посылай месагу и все будет тип топ. да кстати про OnConnect верно подмечено
Destroyer (2004-08-26 00:41:00) [3]
> связано с DNS
Я сначала не понял к чему ты это сказал, но потом дошло, все работает, еще раз спасибо.
Destroyer (2004-08-25 12:03:00) [4]Спасибо, попробую.
Digitman (2004-08-25 08:12:00) [5]
> Destroyer © (25.08.04 01:08) [15]
> Какая разница
еще раз повторяю - очисть св-ва Host и Service, оставь назначенными только Address и Port
в этом случае либо коннект будет установлен либо возникнет ЛЮБАЯ ИНАЯ ошибка, но только не 11001
Destroyer (2004-08-25 01:08:00) [6]Какая разница, даже когда я ввожу IP вылезает та же ошибка.
Digitman (2004-08-24 12:53:00) [7]
> Destroyer © (24.08.04 12:38) [13]
проверяй у себя на машине все что связано с DNS - твоя проблема именно в неразрешении имени хоста в его IP-адрес
Destroyer (2004-08-24 12:38:00) [8]Текст ошибки:
'Windows socket error: (11001), on API 'ASync Lookup'.
Digitman (2004-08-24 08:23:00) [9]
> <--- ошибка
точноесообщение об ошибке приводи, а не домыслы свои !
Destroyer (2004-08-24 01:29:00) [10]Еще проблемка: иногда когда я отправляю сообщение появляется ошибка во время выполнения Application.Processmessages. Помоему ошибка синхронизации, т.е. клиент не может найти сервер, хотя сервер есть и включен.
clientsocket1.Active:=true;
while not ClientSocket1.Active do
Application.Processmessages; <--- ошибка
clientsocket1.Socket.SendText('ok');
clientsocket1.Active:=false;
Может перед отправкой надо произвести какие-нибудь подготовительные действия? В чем тут дело?
Destroyer (2004-08-20 01:06:00) [11]Спасибо всем, буду проверять.
Digitman (2004-08-19 15:59:00) [12]
> а OnWrite - нет
не выдумывай небылиц
Эдик (2004-08-19 15:46:00) [13]procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active;
end;
procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
ShowMessage('OnWrite!!!')
end;
OnConnect возникает а OnWrite - нет...
Digitman (2004-08-19 15:39:00) [14]
> Эдик (19.08.04 15:30) [6]
> такое событие не возникает, только что тест сделал...
еще раз повторяю - ты не прав
если ClientType = ctNonBlocking, это событие обязановозникнуть как минимум однократно сразу за OnConnect
Эдик (2004-08-19 15:30:00) [15]такое событие не возникает, только что тест сделал...
Digitman (2004-08-19 15:14:00) [16]
> Эдик (19.08.04 15:09) [4]
ты не прав
Эдик (2004-08-19 15:09:00) [17]оно же, имхо, возникает, непосредственно, когда происходит запись в сокет...
Digitman (2004-08-19 14:35:00) [18]
> т.е. код:
> mes:=edit2.Text;
> ClientSocket1.Socket.SendText(mes);
> ClientSocket1.Active:=false;
> перенести в это событие
в общкм случае не совсем верно
если переносить, то не в OnConnect, а в OnWrite
Эдик (2004-08-19 14:33:00) [19]а еще для этого можно исспользовать специальное событие для клиента - OnConnect, оно возникает, когда установлена связь, т.е. код:
mes:=edit2.Text;
ClientSocket1.Socket.SendText(mes);
ClientSocket1.Active:=false;
перенести в это событие
Digitman (2004-08-19 08:08:00) [20]
> Можно ли это исправить?
можно
procedure TForm1.Button1Click(Sender: TObject);
var mes:string;
begin
ClientSocket1.Host:=Edit1.Text;
ClientSocket1.Active:=true;
while not ClientSocket1.Active do
Application.Processmessages;
mes:=edit2.Text;
ClientSocket1.Socket.SendText(mes);
ClientSocket1.Active:=false;
end;