Q&A

  • 소켓프로그램중에 모르는게 있어서 질문드립니다
소켓으로 클라이언트 프로그램을 만들고 있습니다.

1 : 1 이 아니고

서버가 여러개고 클라이언트가 하나인 프로그램입니다

서버가 여러개인 관계로 DB 에 서버 IP  하고 PORT 를 저장해놓고

FOR 문을 돌려서 서버마다 다른 메세지를 전달하는 방식입니다

먼저 DB 에 접속해서 서버 IP 하고 Port 번호를 쭈~욱 받아오구여

for 문을 돌려서 그때그때 서버 IP 하고 Port 번호를 배열에 집어넣습니다

** scount 는 전역변수입니다

while not ADOQuery1.Eof do
begin
    server_name[scount] := ADOQuery1.FieldByName('name').AsString;
    server_address[scount] := ADOQuery1.FieldByName('address').AsString;
    server_port[scount]  := ADOQuery1.FieldByName('port').AsInteger;
    Inc(scount);
    ADOQuery1.Next;
end;

그리고 어떤 처리를 한담에 For 문을 돌립니다

** mess 는 전역변수입니다

for i := 0 to scount do
begin
    if server_name[i] = '개똥이' then
    begin
        clientsocket1.address = server_address[i];
        clientsocket1.port       = server_port[i];
        mess := '개똥아 안녕..';
        ClientSocket1.Active := True
    end
   else if server_name[i] = '말똥이' then
    begin
        clientsocket1.address = server_address[i];
        clientsocket1.port       = server_port[i];
        mess := '말똥아 안녕..';
        ClientSocket1.Active := True
    end
   else if server_name[i] = '소똥이' then
    begin
        clientsocket1.address = server_address[i];
        clientsocket1.port       = server_port[i];
        mess := '소똥아 안녕..';
        ClientSocket1.Active := True
    end
end;    


procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    clientsocket1.socket.SendText(mess);
end;

프로그램 줄기는 대충 이렇구여 다른 부분은 이상이 없습니다.

문제는 전 저렇게 하면 각 서버에 다른 메제시가 날아갈 줄 알았거든여

근데 실제로 메세지를 보내면 배열에 저장된 마지막 서버로 모든 메세지가

날아가 버립니다

나머지 서버들은 메세지를 받질 못하더군여.. -_-;;

서버에 접속이 되기전에 서버주소하고 포트번호를 계속

덮어버리는거 같은데여..

소켓은 하나만 생성하고 여러개의 서버에 메세지를 전달할라믄

어떻게 해야할까여..

힌트만이라도 좀 주셨으면 감사하겠습니다.

이거땜에 계속 진도가 안나가여.. -_-;;

부탁드립니다.
4  COMMENTS
  • Profile
    양석용 2002.02.20 13:23
    그 소스에서 차라리 배째라 컴터야 난 클라이언트 소켓 죽어두 한개쓴다식으루
    코딩 하신다면여...

    while not ADOQuery1.Eof do
    begin
        clientsocket1.address :=ADOQuery1.FieldByName'address').AsString;
        clientsocket1.port  := ADOQuery1.FieldByName('port').AsInteger;
        mess:='말똥인지 소똥인지 if 돌려서 대입하궁';
        ClientSocket1.Active := True;
    end;

    procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
        clientsocket1.socket.SendText(mess);
        ADOQuery1.Next;
    end;

    위에 깨작거려논거는 졸리 무식한거예여... .... ...

    PS :  아글구 커넥팅 하는 시간 재서 건너 뛰세여 뭐 소켓이 하나뿐이닝..
            뭐냐문 서버가 꼴가닥 해쓸때....




  • Profile
    양석용 2002.02.20 13:12
    소스가 이상하네여 -_-''

    for i:=0 to 5 do
    begin
          if i=0 then 모라모라... ;
          if i=1 then 머가머가... ;
    end;

    일케 돼고 i=0 일때 커넥트 돼면 뭐해여
    i=1 루 바리 바뀌뿌는디...
    설마니 tcp/ip 소켓 접속이 for 문 보다 빠를려구여 -_-;;
    당근히 마지막으루 몰려 가여...
    혹 몰라 클라이언트 소켓을 여러개 둬따문 몰라두..
    클라이언트 소켓을 동적으루 생성해서 태그루 커넥트 이벤트에서 전송하덩가여.. 안그럼.. 짐상태에서 for문을 고집하문 커넥트 -> 전송 -> 디스커넥트가
    한 소켓에서 발생되니깐 시간이 마니 걸리 것네여...
    -_-;;
  • Profile
    보들레르 2002.02.20 04:30
    안녕하세요~ 구창민입니다.

    ClientSocket 의 이벤트 중에 OnConnected 인가? 하는

    이벤트가 있을 겁니다.

    접속이 성공적으로 이루어졌을 경우 발생하는 이벤트 이지요.

    그때 메세지를 전송하도록 프로그램을 고쳐보세요.

    왜냐하면 소켓이 컨넥트 되는 데에는 몇가지 보이지 않는

    과정을 거치기 때문이지요.

    틀림없이 될겁니다.

    그럼 ~ 항상 즐거운 프로그래밍 하시길~~~~



  • Profile
    김영철 2002.02.20 05:04
    먼저 답변 감사드립니다 (__)

    onConnect 다음에 메세지를 작성하라는 뜻이신지요?

    음..

    connect 되기전에 메세지를 작성하는거하고

    구체적으로 어떤 차이점이 있을까요?

    바쁘시겠지만 한번 더 부탁드리겠습니다

    다시한번 감사드립니다