В общем, не работает программа на сокетах помогите пожалуйста найти ошибку.
Вкратце опишу собственно саму проблему:
Пользователь №1 - в своей программе вводит адрес и порт для подключения к пользователю №2.
Пользователь №2 - к нему осуществляется подключение первого пользователя, а он в свою очередь подключается автоматически к первому пользователю.
Создается что то вроде 2х каналов связи для передачи сообщений в одностороннем порядке(один-в одну сторону, другой-в другую).
Так вот подключение создается успешно, но сообщения от пользователя №1 к №2 не передаются, а сообщение от 2 к 1 нормально.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
srvrsckt1: TServerSocket;
clntsckt1: TClientSocket;
btn1: TButton;
btn2: TButton;
edt1: TEdit;
edt2: TEdit;
edt3: TEdit;
lst1: TListBox;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
lbl1: TLabel;
lbl2: TLabel;
procedure btn1Click(Sender: TObject);
procedure clntsckt1Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure btn2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure srvrsckt1ClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
procedure clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure srvrsckt1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a:string;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
{Если соединение уже установлено - прерываем его.}
if clntsckt1.Active then
begin
clntsckt1.Close;
Exit; {...и выходим из обработчика}
end;
{Присваиваем свойствам Host и Port нужные значения}
clntsckt1.Host := Edt1.Text;
clntsckt1.Port := StrToInt(Edt2.Text);
{Пытаемся открыть сокет и установить соединение}
clntsckt1.Open;
end;
procedure TForm1.clntsckt1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var
b:string;
begin
b:=clntsckt1.Socket.RemoteAddress;
{Как только произошло соединение - посылаем приветствие}
Socket.SendText('HELLo');
Lst1.Items.Add('<Вы подключились к: ' +b);
end;
procedure TForm1.clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
{Если пришло сообщение - добавляем его в ListBox}
Lst1.Items.Add('> ' + Socket.ReceiveText);
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
{Нажата кнопка - посылаем текст из третьего TEdit}
clntsckt1.Socket.SendText(Edt3.Text);
Lst1.Items.Add('< ' + Edt3.Text);
edt3.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
srvrsckt1.Active:=true;
if srvrsckt1.Active=true then label1.Color:=clGreen;
if srvrsckt1.Active=true then label1.Caption:='ONLINE';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
srvrsckt1.Active:=false;
if srvrsckt1.Active=false then label1.Color:=clRed;
if srvrsckt1.Active=false then label1.Caption:='OFFLINE';
end;
procedure TForm1.srvrsckt1ClientWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
Lst1.Items.Add('> ' + Socket.ReceiveText);
end;
procedure TForm1.clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
if srvrsckt1.Active=False then Form2.ShowModal;
end;
procedure TForm1.srvrsckt1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var a:string;
begin
a:=srvrsckt1.Socket.Connections[0].RemoteAddress;
if clntsckt1.Active then
begin
clntsckt1.Close;
Exit; {...и выходим из обработчика}
end;
{Присваиваем свойствам Host и Port нужные значения}
clntsckt1.Host :=a;
clntsckt1.Port :=1025;
{Пытаемся открыть сокет и установить соединение}
clntsckt1.Open;
end;
end.
ps: вот исходник
http://depositfiles.com/files/428lmy64x обратите внимание на эвенты для компонентов батон, и сокеты.