Q&A

  • 왜 server쪽에서 client가 보낸 소켓내용을 못받을까요?
client socket과 server socket를 exe를 통해서 쏘면 잘 받는데.

(각각 exe를 만들어서 실행해보았습니다.)

그런데..server socket쪽의 exe를 띄워놓고 COM으로 client쪽을 만들어서 asp를 실행하면 동작을 안해요. 왜그렇죠?

고수님들 부탁드려요!



Client쪽의 코딩은 다음과 같습니다.

----------------------------------------------------------------------------

unit Usendmsg2;



interface



uses

ComObj, ActiveX, Psendmsg2_TLB, StdVcl,ScktComp;



type

Tsendmsg2 = class(TAutoObject, Isendmsg2)

clients: TClientSocket;

protected

function Msendmsg2(const msg: WideString): WideString; safecall;

{ Protected declarations }

end;





implementation



uses ComServ;



function Tsendmsg2.Msendmsg2(const msg: WideString): WideString;

var aaa: string;

begin

clients := TClientSocket.Create(nil);

clients.Address := '211.117.100.142';

clients.port := 5432;

clients.Active := true;

clients.Socket.SendText(msg);

aaa := clients.socket.ReceiveText;

result := msg+aaa;

clients.Active := false;

end;



initialization

TAutoObjectFactory.Create(ComServer, Tsendmsg2, Class_sendmsg2,

ciMultiInstance, tmApartment);

end.

---------------------------------------------------------------------

server쪽의 코딩은 다음과 같습니다.

---------------------------------------------------------------------

unit Usockettest4;



interface



uses

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

ScktComp, StdCtrls;



type

TForm1 = class(TForm)

ServerSocket1: TServerSocket;

Edit1: TEdit;

procedure ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.ServerSocket1ClientRead(Sender: TObject;

Socket: TCustomWinSocket);

begin

edit1.text := socket.ReceiveText+'보냈슴';

socket.SendText(edit1.text);

ServerSocket1.Active := false;

ServerSocket1.Active := true;

end;



end.

----------------------------------------------------------------------------

1  COMMENTS
  • Profile
    강인규 2001.07.04 07:35
    흠 아마도 확실히는 기억나지 않지만....



    fastnet의 소켓은 이벤트를 순차적으로 처리하지 않아서 애먹었던 기억이 있습니다..



    예를 들어..



    with TClientSocket.Create(self) do

    begin

    active := true;

    sendtext('이바바바');

    end;



    이렇게 코딩을 했는데 접속이 이루어지기도 전에 메세지를 날려서 에러가 나곤했던 기억이

    나는군요.(그 후로 인디를 사용했던거 같습니다. ㅡ.ㅡ;;;)



    시간이 좀 널럴하면 테스트도 해서 올려드리겠지만 워낙 정신이 없어서리...죄송합니다.



    예전엔 이런 코드로 대충 해결했던거 같군요..



    var

    I : Integer;

    begin

    active := true;



    while (clientsocket.connected = flase) or (I < 100000) do

    begin

    application.Processmessage;

    Inc(I); //접속이 실패할 경우 무한루프에 빠지는걸 방지

    end;



    if clientsocket.connected = true then

    sendtext('이바바바');

    end;



    코드는 델파이에서 작업하지 않았으므로 버그가 있을 수 있습니다.

    그리고 ASP컴퍼넌트 처럼 죽으면 아주 피곤한 것들은 반드시 try ~ except 로 묶는걸 권장하고 싶군요.



    당부드리고 싶은 한마디. 그냥 인디쓰시죠..^^;

    즐프하세여~ ^-^







    sizzling wrote:

    > client socket과 server socket를 exe를 통해서 쏘면 잘 받는데.

    > (각각 exe를 만들어서 실행해보았습니다.)

    > 그런데..server socket쪽의 exe를 띄워놓고 COM으로 client쪽을 만들어서 asp를 실행하면 동작을 안해요. 왜그렇죠?

    > 고수님들 부탁드려요!

    >

    > Client쪽의 코딩은 다음과 같습니다.

    > ----------------------------------------------------------------------------

    > unit Usendmsg2;

    >

    > interface

    >

    > uses

    > ComObj, ActiveX, Psendmsg2_TLB, StdVcl,ScktComp;

    >

    > type

    > Tsendmsg2 = class(TAutoObject, Isendmsg2)

    > clients: TClientSocket;

    > protected

    > function Msendmsg2(const msg: WideString): WideString; safecall;

    > { Protected declarations }

    > end;

    >

    >

    > implementation

    >

    > uses ComServ;

    >

    > function Tsendmsg2.Msendmsg2(const msg: WideString): WideString;

    > var aaa: string;

    > begin

    > clients := TClientSocket.Create(nil);

    > clients.Address := '211.117.100.142';

    > clients.port := 5432;

    > clients.Active := true;

    > clients.Socket.SendText(msg);

    > aaa := clients.socket.ReceiveText;

    > result := msg+aaa;

    > clients.Active := false;

    > end;

    >

    > initialization

    > TAutoObjectFactory.Create(ComServer, Tsendmsg2, Class_sendmsg2,

    > ciMultiInstance, tmApartment);

    > end.

    > ---------------------------------------------------------------------

    > server쪽의 코딩은 다음과 같습니다.

    > ---------------------------------------------------------------------

    > unit Usockettest4;

    >

    > interface

    >

    > uses

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

    > ScktComp, StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > ServerSocket1: TServerSocket;

    > Edit1: TEdit;

    > procedure ServerSocket1ClientRead(Sender: TObject;

    > Socket: TCustomWinSocket);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.ServerSocket1ClientRead(Sender: TObject;

    > Socket: TCustomWinSocket);

    > begin

    > edit1.text := socket.ReceiveText+'보냈슴';

    > socket.SendText(edit1.text);

    > ServerSocket1.Active := false;

    > ServerSocket1.Active := true;

    > end;

    >

    > end.

    > ----------------------------------------------------------------------------