Q&A

  • TUdpSocket을 이용한 UDP 통신에서 수신 문제로 질문 올립니다.
안녕하세요 :)

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를 찾아보긴 했는데 아직 소스만 보고 급! 이해할 실력은 안 되는지라 이렇게 질문을 올립니다^-^)


감사합니다. 즐거운 하루 보내세요^-^!
2  COMMENTS
  • Profile
    최용일 2009.01.30 19:49
    Connect, Disconnect는 UDP Client로 동작하여 서버에 연결하고 끊을 때 사용하구요.
    Open(=>Active:=True), Close(=>Active:=False)는 서버로 동작하게 해줍니다. 이후에 자동으로 listen하도록 설정되고 데이터가 오면 OnReceive이벤트를 발생시켜줍니다.

    TLUDPComponent와 별 차이는 없어보입니다.

    헬프에 자세히 나옵니다. 터보델파이는 안 써봐써 잘 모르겠지만... 헬프가 부실할 것 같지는 않네요...
  • Profile
    absurdite 2009.01.30 23:34
    답변 감사합니다.
    Lazarus로 했을 때 수신하는 걸로 봐서는, 아마 제가 뭔가 잘못 세팅한 게 아닌가 싶네요T-T
    아직 해결이 제대로 되지는 않았지만...말씀하신 것을 단서로 다시 해 봐야 할 것 같습니다.

    볼랜드에서 나온 거니 헬프가 분명 부실하지는 않을 텐데...(Lazarus에서 문서를 찾기도 어렵고 해서 일단 바꿨는데요 ;)
    헬프에서 Sockets, TUdpSocket 등으로 검색해도,
    딱히 나오지 않는 것으로 봐서는 이것도 제가 뭔가 실수를 하고 있는 게 아닌가 싶기는 한데...
    아무래도 공부를 좀 더 해야 하는 모양입니다T-T 뭔가 엉뚱한 데서 찾고 있다거나...
    (수정- 잘 찾아보니 pdf로 된 help 파일이 따로 있군요@_@;)

    답변 다시 감사드립니다. 다시 잘 찾아보겠습니다~ :)
    • 타락천사
      2009.02.06 22:13
      앞에 "DB 이미지 불러와서 재정장 하기." 의 답변 참고 하시면 될 겁니다.
    • 타락천사
      2009.02.04 21:44
      핸들이 없으면 못 합니다.. 핸들이 없는 넘들은 시스템에서 그리라는 메시지를 받는게 아니라, Parent...
    • 김용무
    • 2009.02.04 02:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.04 21:42
      질문의 요지을 모르겠군요..
    • 밴댕이
    • 2009.02.04 02:17
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.04 21:41
      기본 기능에는 없습니다. 개발자가 같은 셀을 모두 찾아서 직접 그려야 합니다.
    • 밴댕이
      2009.02.05 21:17
      직접그리드 코딩을 어느 이벤트에서 어떻게 코딩해야 하는지 잘 모르겠네요.. drawcell이벤트에서 하는...
    • 타락천사
      2009.02.06 22:37
      델마당에 있는 답변 입니다. http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&st...
    • 타락천사
      2009.02.04 21:39
      오래 전에 써봐서 기억이 안납니다만... Filter 속성 이 있는 컴포넌트 의 경우 사용 예가 크게 2가지 ...
    • 야단났네~*
      2009.02.10 19:11
      감사합니다. 다른 업무로 출장다녀와서 아직도 손 못대고 있었는데 오늘 한번 해 봐야겠습니다.
    • 야단났네~*
      2009.04.07 23:17
      이 문제에 대해서 새로운 국면입니다. 안 먹는게 아니었더군요. 영문이나 숫자일 경우에는 잘 먹습니다...
    • 박진수
    • 2009.02.04 00:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.04 21:32
      빌더 문제 군요.. 1. TMS 콤포넌트를 폼에서 모두 빼세요.. 2. 프로젝트 파일(*.bpr) 을 Ultra Edi...
    • 신철우
    • 2009.02.03 21:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.04 21:26
      메세지를 보면 OLE control(= InkEdit) 이 Window Handle 에 접근 할 수 없다는 의미 군요.. 아마 Ink...
    • 사다리
    • 2009.02.03 08:36
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.04 21:22
      문자열 처리를 모두 2바이트로 처리하시면 될 것 같습니다.. String 타입의 변수를 모두 WiseString ...
    • 사다리
      2009.02.04 22:44
      흠... 제가 어떤식으로 전달하던 인디 내부에서는 String로 받네요.. 미치겠네요.. 한글... 왜 ...
    • 타락천사
      2009.02.05 21:15
      출근하면서 생각해 봤는데, Indy delphi2009 버젼이 나와야 해결될 문제 군요..
    • 김범진
      2009.05.15 23:32
      저는 idsntp.synctime이 오작동하는 문제 때문에 데브기어 담당자에게 물었습니다. 스트링으로 받는 문...
    • Sway
    • 2009.02.03 03:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • lee, js
    • 2009.02.02 23:30
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 윤옥순
    • 2009.02.02 22:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2009.02.03 00:06
      Types유닛 추가하세요. 도움말 보시면 바로 나오는데.... 쩝~...
    • 타락천사
      2009.02.02 21:41
      TNumericField(Fields[j-1]).DisplayFormat := ',0'; 로 해보시죠.. 단지.. 짐작 입니다..
    • 스마일
      2009.02.02 22:24
      답변 감사합니다. 근데... 결과가 똑같아요. T T
    • 타락천사
      2009.02.03 01:40
      그리드 명칭으로 봐선 Quantum Gride 인 것 같군요.. 맞다면, 좌측 메뉴 에서 한델소모임-DevExpress ...
    • lee, js
    • 2009.02.02 19:51
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.02.02 21:38
      AddScrCmdTEC(MS, 450+li_X,10, add_image.Picture.Bitmap)); // X, Y 좌표 와 비트맵 AddScrCmdTEC...
    • lee, js
      2009.02.02 23:43
      일단 감사합니다만... 위의 타락1004님처럼 해보니 아래와 같이 type 에러가 나네요???? - incompa...
    • 타락천사
      2009.02.03 01:37
      integer 값을 넣어야 하는데, TBitmap 을 넣었다는 에러 입니다. integer 값 이라면, Left, Top, Widt...
    • 소울해커
      2009.02.02 22:43
      1. 현재 쿼리수만큼 쿼리 컴포넌트를 올려놓은 프로그램을 분석/수정하고 있습니다. 결론은 사람...
    • HighElf
      2009.02.03 00:27
      답변감사드립니다
    • 사다리
    • 2009.01.31 03:10
    • 0 COMMENTS
    • /
    • 0 LIKES
    • absurdite
    • 2009.01.30 03:39
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2009.01.30 19:49
      Connect, Disconnect는 UDP Client로 동작하여 서버에 연결하고 끊을 때 사용하구요. Open(=>Active:=Tr...
    • absurdite
      2009.01.30 23:34
      답변 감사합니다. Lazarus로 했을 때 수신하는 걸로 봐서는, 아마 제가 뭔가 잘못 세팅한 게 아닌가 싶...
    • 아낙네
    • 2009.01.29 22:21
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2009.01.30 00:53
      WordWrap.. 오래간만에 봤군요... WordWrap 속성이 True 면 Tab 문자를 기준으로 줄을 바꿔 줍니다.. ...
    • 술친구
      2009.01.31 00:44
      QRLabel 의 Autosize를 False 로 하고 크기를 출력하는 위치만큼 가로와 세로의 크기를 미리 조정해 놓으...
    • 김상형
    • 2009.01.29 20:43
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2009.01.30 00:43
      동적배열입니다. SetLength로 크기 잡고 Move같은 함수로 데이터 이동하시면 됩니다. var Str: s...
    • 타락천사
      2009.01.30 01:07
      sTemp, sTest: string; szTemp: TByteArray; pzTemp: PByteArray; ....... 1. String or P...
    • 타락천사
      2009.01.30 01:10
      SetLength(Dyn, Length(Str)); Move(Str[1], Dyn[0], Length(Str)); 와 SetLength(Dyn, L...