Q&A

  • socket처음입니다.도와주세요
클라이언트는 제컴에서 만들고 서버는 리눅스로 하는데,

속켓으로 data를 보내려고 하는데 clientSocket컴퍼넌트만 사용하면 되나요?

그리고 address에 와 host의 차이점에 대해서 말씀좀 해주세요.

그리고 host에다 제가 알기론 서버 ip주소를 넣어야 되는걸로 알고 있는데

맞는건지도 알고 싶네요.

부탁합니다.

4  COMMENTS
  • Profile
    이경문 2001.12.14 01:47
    소켓관련 컴포넌트나 라이브러리는 많이 있는데, 처음 사용하신다면 ClientSocket을 쓰시는 게 무방합니다.



    그리고 Host는 말 그대로 HostName을 적는 거구요, Address는 IP Address(dotted 4 format)을 적는 겁니다.

    HostName을 명시하였다면 내부적으로 Address로 변환해 줍니다(gethostbyname이라는 winsocket API를 호출하여서 DNS에게 해당하는 해당 IP를 가져 옴. 즉 조금의 부하가 있을 수 있음).





    socket초보 wrote:

    > 클라이언트는 제컴에서 만들고 서버는 리눅스로 하는데,

    > 속켓으로 data를 보내려고 하는데 clientSocket컴퍼넌트만 사용하면 되나요?

    > 그리고 address에 와 host의 차이점에 대해서 말씀좀 해주세요.

    > 그리고 host에다 제가 알기론 서버 ip주소를 넣어야 되는걸로 알고 있는데

    > 맞는건지도 알고 싶네요.

    > 부탁합니다.

  • Profile
    socket초보 2001.12.14 02:43
    이경문 wrote:

    > 소켓관련 컴포넌트나 라이브러리는 많이 있는데, 처음 사용하신다면 ClientSocket을 쓰시는 게 무방합니다.

    >

    > 그리고 Host는 말 그대로 HostName을 적는 거구요, Address는 IP Address(dotted 4 format)을 적는 겁니다.

    > HostName을 명시하였다면 내부적으로 Address로 변환해 줍니다(gethostbyname이라는 winsocket API를 호출하여서 DNS에게 해당하는 해당 IP를 가져 옴. 즉 조금의 부하가 있을 수 있음).

    >

    >

    > socket초보 wrote:

    > > 클라이언트는 제컴에서 만들고 서버는 리눅스로 하는데,

    > > 속켓으로 data를 보내려고 하는데 clientSocket컴퍼넌트만 사용하면 되나요?

    > > 그리고 address에 와 host의 차이점에 대해서 말씀좀 해주세요.

    > > 그리고 host에다 제가 알기론 서버 ip주소를 넣어야 되는걸로 알고 있는데

    > > 맞는건지도 알고 싶네요.

    > > 부탁합니다.

  • Profile
    이경문 2001.12.14 02:51
    10054 : 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다.



    연결이 되었는데 10054에러가 날 수도 있고

    연결이 끊겨서 10054 에러가 날 수 있습니다.

    해당 에러는 소스를 봐야 해결할 수 있을 것 같군요.

    실제로 SendText나 SendBuf를 할 때 연결이 되어 있는지(ClientSocket1.Active)

    확인해 보시기 바랍니다.



    socket초보 wrote:

    > 이경문 wrote:

    > > 소켓관련 컴포넌트나 라이브러리는 많이 있는데, 처음 사용하신다면 ClientSocket을 쓰시는 게 무방합니다.

    > >

    > > 그리고 Host는 말 그대로 HostName을 적는 거구요, Address는 IP Address(dotted 4 format)을 적는 겁니다.

    > > HostName을 명시하였다면 내부적으로 Address로 변환해 줍니다(gethostbyname이라는 winsocket API를 호출하여서 DNS에게 해당하는 해당 IP를 가져 옴. 즉 조금의 부하가 있을 수 있음).

    > >

    > >

    > > socket초보 wrote:

    > > > 클라이언트는 제컴에서 만들고 서버는 리눅스로 하는데,

    > > > 속켓으로 data를 보내려고 하는데 clientSocket컴퍼넌트만 사용하면 되나요?

    > > > 그리고 address에 와 host의 차이점에 대해서 말씀좀 해주세요.

    > > > 그리고 host에다 제가 알기론 서버 ip주소를 넣어야 되는걸로 알고 있는데

    > > > 맞는건지도 알고 싶네요.

    > > > 부탁합니다.

  • Profile
    socket초보 2001.12.14 03:22
    님아 소스는 아래와 같아요 이상이 어딘지 모르겠어요.

    unit socket;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    ScktComp, StdCtrls, ComCtrls;



    type

    TRtuCmdMsg = record

    opcode : array[1..4] of Char;

    rtype : array[0..1] of Char;

    cmd : array[0..3] of Char;

    rtuid : array[0..31] of Char;

    ip : array[0..15] of Char;

    size : Integer;

    data : array[0..256] of Char;

    end;//Send Message

    TRtuCmdRtn = record

    opcode : array[0..3] of Char;

    rtype : array[0..1] of Char;

    cmd : array[0..3] of Char;

    rtuid : array[0..31] of Char;

    ip : array[0..15] of Char;

    size : Integer;

    data : array[0..32] of Char;

    end;//Recive Message



    TForm1 = class(TForm)

    PageControl1: TPageControl;

    TabSheet1: TTabSheet;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    ed_ip: TEdit;

    ed_Cmd: TEdit;

    CB_Op: TComboBox;

    CB_Command: TComboBox;

    CB_Type: TComboBox;

    ED_RtuId: TEdit;

    TabSheet2: TTabSheet;

    GroupBox1: TGroupBox;

    memSend: TMemo;

    GroupBox2: TGroupBox;

    memRecv: TMemo;

    ClientSocket1: TClientSocket;

    procedure FormShow(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure CB_OpKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure CB_CommandKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    procedure ClientSocket1Connect(Sender: TObject;

    Socket: TCustomWinSocket);

    procedure ClientSocket1Write(Sender: TObject;

    Socket: TCustomWinSocket);

    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

    procedure CB_OpChange(Sender: TObject);

    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;

    ErrorEvent: TErrorEvent; var ErrorCode: Integer);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;

    RtuCmdMsg : TRtuCmdMsg;

    RtuCmdRtn : TRtuCmdRtn;

    implementation



    {$R *.DFM}



    procedure TForm1.FormShow(Sender: TObject);

    begin

    ED_Cmd.SetFocus;

    end;



    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

    begin

    ClientSocket1.Close;

    Action := CaFree;

    end;



    procedure TForm1.CB_OpKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Key = VK_RETURN then

    SelectNext(Sender as TWinControl, True, True);

    end;



    procedure TForm1.CB_CommandKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Key = VK_RETURN then

    if ClientSocket1.Active = False then begin

    ClientSocket1.Host := '187.1.10.23';

    ClientSocket1.Port := 9041;

    ClientSocket1.Active := TRUE;

    end else

    if ClientSocket1.Active = TRUE then begin

    ClientSocket1.Active := False;

    end;

    end;



    procedure TForm1.ClientSocket1Connect(Sender: TObject;

    Socket: TCustomWinSocket);

    var

    llength : Integer;

    begin

    ZeroMemory(@RtuCmdMsg, SizeOf(RtuCmdMsg));

    with RtuCmdMsg do

    begin

    StrPCopy(@opcode[1], Trim(Ed_Cmd.text));

    StrPCopy(rtype,CB_Type.text);

    StrPCopy(cmd, CB_Op.Text);

    StrPCopy(rtuid, ED_RtuId.text);

    StrPCopy(ip, ed_ip.Text);

    size := Length(CB_Command.Text);

    StrPCopy(data, CB_Command.Text);

    end;



    With RtuCmdMsg do begin

    llength := length(opcode);

    ShowMessage('opcode='+ opcode +'='+ IntToStr(llength));



    llength := length(rtype);

    ShowMessage('type='+ rtype +'='+ IntToStr(llength));



    llength := length(cmd);

    ShowMessage('Cmd='+ cmd +'='+ IntToStr(llength));



    llength := length(rtuid);

    ShowMessage('Rtuid=' + rtuid +'='+ IntToStr(llength));



    llength := length(ip);

    ShowMessage('ip='+ ip +'='+ IntToStr(llength));

    ShowMessage('size='+ IntToStr(size));

    ShowMessage('data='+ data);

    end;



    ClientSocket1.Socket.SendBuf(RtuCmdMsg, SizeOf(RtuCmdMsg));



    end;



    procedure TForm1.ClientSocket1Write(Sender: TObject;

    Socket: TCustomWinSocket);

    begin

    memSend.Lines.Add('opcode = '+StrPas(@RtuCmdMsg.opcode[1]));

    memSend.Lines.Add('rtype = '+StrPas(RtuCmdMsg.rtype));

    memSend.Lines.Add('cmd = '+StrPas(RtuCmdMsg.cmd));

    memSend.Lines.Add('rtuid = '+StrPas(RtuCmdMsg.rtuid));

    memSend.Lines.Add('ip = '+StrPas(RtuCmdMsg.ip));

    memSend.Lines.Add('size = '+IntToStr(RtuCmdMsg.size));

    memSend.Lines.Add('data = '+StrPas(RtuCmdMsg.data));

    memSend.Lines.Add('************************************************');

    end;



    procedure TForm1.ClientSocket1Read(Sender: TObject;

    Socket: TCustomWinSocket);

    begin

    ZeroMemory(@RtuCmdRtn, SizeOf(RtuCmdRtn));



    ClientSocket1.Socket.ReceiveBuf(RtuCmdRtn, SizeOf(RtuCmdRtn));



    memRecv.Lines.Add('opcode = '+StrPas(RtuCmdRtn.opcode));

    memRecv.Lines.Add('rtype = '+StrPas(RtuCmdRtn.rtype));

    memRecv.Lines.Add('cmd = '+StrPas(RtuCmdRtn.cmd));

    memRecv.Lines.Add('rtuid = '+StrPas(RtuCmdRtn.rtuid));

    memRecv.Lines.Add('ip = '+StrPas(RtuCmdRtn.ip));

    memRecv.Lines.Add('size = '+IntToStr(RtuCmdRtn.size));

    memRecv.Lines.Add('data = '+StrPas(RtuCmdRtn.data));

    memRecv.Lines.Add('************************************************');





    ClientSocket1.Active := False;



    CB_OP.SetFocus;

    end;



    procedure TForm1.CB_OpChange(Sender: TObject);

    begin

    CB_Command.ItemIndex := CB_Op.ItemIndex;

    end;



    procedure TForm1.ClientSocket1Error(Sender: TObject;

    Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

    var ErrorCode: Integer);

    begin

    ShowMessage('에러가 났군요' + IntToStr(ErrorCode));

    ErrorCode := 0;

    Socket.Close;



    end;







    end.