안녕하세요 :)
Lazarus를 사용하여 UDP 통신 프로그램을 만들다가,
Turbo Delphi로 갈아탔습니다 :)
Lazarus에서 TLUDPComponent를 사용하던 것과 유사하게
TUdpSocket을 사용하고 있는데요.
보내는 것은 문제없이 됩니다.
문제는 수신 쪽이 제대로 안 되는 것인데...
Active는 true로, block mode는 bmBlocking으로 (실은 non-blocking 으로도 설정을 해 봤습니다만-_-;),
그 외 Local host/port, Remote host/port 설정도 다 해 주었습니다.
FormCreate 함수에
<!--CodeS-->
UDP1.Connect;
UDP1.Open;
<!--CodeE-->
와 같이 해 주었고, (Open 함수는 전송만 테스트할 때는 안 넣었다가, 수신이 안 되어서 혹시 이게 뭔가 여는 역할을 하는가 해서 넣어봤는데, 그래도 안 되는군요T-T)
보내는 부분은 (송신하려는) string 변수인 msg를 이용해서
<!--CodeS-->
sendResult := UDP1.Sendln(msg, '');
<!--CodeE-->
와 같이 보냈습니다. 송신이 잘 되는 것은 확인했구요.
(반대측 시스템은 델파이로 개발하고 있지 않아서 확인이 됩니다 :)
문제는 메시지가 도착했을 때 OnReceive 이벤트를 어떻게 생성하게 하는가를 모른다는 것인데...-_-;
<!--CodeS-->
procedure TfmMain.UDP1Receive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
<!--CodeE-->
위의 OnReceive 이벤트 핸들러가 호출되면 Buf에서 메시지를 읽을 수 있지 싶어 보이기는 하는데, 메시지가 수신되었을 때 어떻게 이벤트가 발생하도록 하는지 모르겠습니다.
Lazarus로 만들 때는
<!--CodeS-->
UDP1.Connect(ip, port1);
<!--CodeE-->
..와 같이 연결하고,
<!--CodeS-->
UDP2.Listen(port2);
<!--CodeE-->
와 같이 TLUDPComponent의 Listen 함수를 이용하여 해당 컴퍼넌트 객체가 특정 포트를 listen할 수 있게 했는데,
이렇게 하니 메시지 수신시 OnReceive 이벤트가 잘 생겨서 이벤트 핸들러에서
<!--CodeS-->
UDP2.Get(rmsg, 40);
<!--CodeE-->
과 같이 Get 함수로 메시지를 잘 읽어올 수 있었습니다.
TUdpSocket에서도 Listen과 같은 역할을 하는 함수가 있는지요?
(아니면 어디 다른 곳에서 receive 함수들을 직접 실행해 주어야 하는지...)
그리고 Help를 뒤져봐도 (터보 델파이가 익숙치 않아선지) TUdpSocket 등의 여러 컴퍼넌트에 대한 설명을 제대로 찾아볼 수가 없던데, 혹시 API 같은 것들이 정리되어 있는 문서가 있는지요? 마치 java api 문서 같은...
(자동완성에서 뜨는, 마치 하이퍼링크 같은 파란 글씨의 밑줄쳐진 Declared in "Sockets.TUdpSocket"과 같은 문장을 클릭해봐도 반응이 없더군요. 이건 문서가 연결되어 있다는 것인지, 아니면 그냥 강조로 색/밑줄을 넣은 것인지...Sockets.pas를 찾아보긴 했는데 아직 소스만 보고 급! 이해할 실력은 안 되는지라 이렇게 질문을 올립니다^-^)
감사합니다. 즐거운 하루 보내세요^-^!
Open(=>Active:=True), Close(=>Active:=False)는 서버로 동작하게 해줍니다. 이후에 자동으로 listen하도록 설정되고 데이터가 오면 OnReceive이벤트를 발생시켜줍니다.
TLUDPComponent와 별 차이는 없어보입니다.
헬프에 자세히 나옵니다. 터보델파이는 안 써봐써 잘 모르겠지만... 헬프가 부실할 것 같지는 않네요...