Winsock직접 제어 보다, TTcpClient가 여러모로 편리합니다.
http://blog.hjf.pe.kr/343
https://www.delmadang.com/community/bbs_view.asp?bbsNo=18&bbsCat=0&indx=435202&page=3# 에 잘 나와 있습니다.
황장군와우 님이 쓰신 글 :
: 현재 멀티캐스트로 데이터를 받아서 처리하는것을 돌리는 중입니다.
: 그런데 지금 현재는 하나의 프로세서로 돌리고 있는데 물론 각 라인마다 각각의 다른데이터가 날라옵니다.
: 처리하는 부분은 같은데 함수로 만들어 놨는데 각각이 공유해서 쓰지는 않지만 처리하는거는 동일합니다.
:
: 지금 소스가
: unit Unit1;
:
: interface
:
: uses
: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms
: ;
:
: const
: WM_SOCK1 = WM_USER + 1;
: UDPPORT1 = 18500;
: MY_GROUP1 = '255.255.255.0';
:
: WM_SOCK2 = WM_USER + 2;
: UDPPORT2 = 18501;
: MY_GROUP2 = '255.255.255.1';
:
: type
: ip_mreq = record
: imr_multiaddr: in_addr; (* IP multicast address of group *)
: imr_interface: in_addr; (* local IP address of interface *)
: end;
: TIpMReq = ip_mreq;
: PIpMReq = ^ip_mreq;
:
: type
: TfrmMain = class(TForm)
: Button1: TButton;
: private
: procedure ReadData1(var Message: TMessage); message WM_SOCK1;
: procedure ReadData2(var Message: TMessage); message WM_SOCK2;
: public
: end;
:
: == 이렇게 한다음 멀티캐스트 등록한다음
: procedure TfrmMain.ReadData1(var Message: TMessage);
: var
: buffer: Array [1..4096] of char;
: len: integer;
: flen: integer;
: Event: word;
: value: string;
: begin
: flen:=sizeof(FSockAddrIn1);
: Event := WSAGetSelectEvent(Message.LParam);
: if Event = FD_READ then
: begin
: len := recvfrom(s1, buffer, sizeof(buffer), 0, FSockAddrIn1, flen);
: value := copy(buffer, 1, len);
:
: aaa(value);
:
: end;
: end;
:
: == 위와같이 사용합니다.
:
: 위 프로그램처럼 할때 데이터를 받아서 처리하는 aaa를 쓰레드로 만들어야 하나요 아님 멀티캐스트 등록하는것을 쓰레드로 만들어야 하나요?
:
: 다들 쓰레드를 사용해서 해야 각각이 데이터를 받아서 처리 한다던데.
: 어느부분을 쓰레드로 만들어야 할지를 모르겠습니다.
:
: 조언 부탁합니다.