멀티캐스트 아이피 영역 224.0.0.0 to 239.255.255.255
사용자가 A, B, C, D, E가 있다.
A : 아이피 234.3.4.1 포트 22401 사용
B : 아이피 234.3.4.2 포트 22401 사용
C : 아이피 234.3.4.3 포트 22401 사용
D : 아이피 234.3.4.4 포트 22401 사용
E : 아이피 234.3.4.5 포트 22401 사용
위의 정보를 바탕으로
A의 경우 234.3.4.1로 자신의 정보를 전송
B의 경우 234.3.4.2로 자신의 정보를 전송
C의 경우 234.3.4.3로 자신의 정보를 전송
D의 경우 234.3.4.4로 자신의 정보를 전송
E의 경우 234.3.4.5로 자신의 정보를 전송
그리고
A는 수신을 아래와 같이 4개의 멀티캐스트 아이피와
포트를 사용하여 수신하고자 함
234.3.4.2 22401 B의 데이타를 수신하고자 함
234.3.4.3 22401 C의 데이타를 수신하고자 함
234.3.4.4 22401 D의 데이타를 수신하고자 함
234.3.4.5 22401 E의 데이타를 수신하고자 함
문제는 수신로직을 실행시
FUDPSocket := TUDPBlockSocket.Create();
FUDPSocket.CreateSocket;
(1) FUDPSocket.Bind('0.0.0.0', 22401);
(2) FUDPSocket.AddMulticast( fMulticastIP );
(3) if FUDPSocket.LastError <> 0 then Exit;
(1)에서 동일한 주소('0.0.0.0')로 bind를 4번 한다. 1번째는 잘됨
그러나 2번째부터 에라가 발생
(2)를 수행하는중 먼저 10048(Address in use) 에라가 발생하여
10022 (Socket not bound, invalid address or listen is not
invoked prior to accept.) 가 발생합니다.
(3)에서는 위의 에라코드들 때문에 당현히 빠져 나가겠지요. 이 부분을 마킹하면
빠져나가지는 않을지라도 소켓이 제 기능을 못합니다.
그리고 나서부터 FUDPSocket(멀티캐스트를 수행하는 소켓)이 제 기능을
하지 못합니다.
이러한 현상을 없앨려면 어떻게 해야 하는지를 알고 싶습니다.
다시 말하면 한 컴퓨터에서 동일한 포트에서 멀티캐스트 아이피를 여러개 열어서
데이타 수신이 가능한지 알고 싶습니다.
만일 안된다면 다른 좋은 방안이 알려주시면 감사하겠습니다.
<!--CodeS-->
unit uVideoMulticastRecvThread;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, stdctrls,
ExtCtrls, uType, blcksock;
type
TVideoMulticastRecvThread = class(TThread)
private
fThreadClose : Boolean;
FUDPSocket: TUDPBlockSocket;
FValue : string;
fMulticastIP : string;
fNum : integer;
protected
procedure Execute; override;
public
constructor Create(Const ANum : integer; Const mip : string; );
destructor Destroy; override;
property ThreadClose : Boolean read fThreadClose write fThreadClose;
end;
implementation
constructor TVideoMulticastRecvThread.Create( Const ANum : integer; Const mIP : string );
begin
inherited Create(true);
fMulticastIP := mIP;
fNum := ANum;
fThreadClose := false;
FreeOnTerminate := True;
Resume;
VideoTrdList.Add(self);
inc(nVTrdCount);
end;
destructor TVideoMulticastRecvThread.Destroy;
begin
Dec(nVTrdCount);
VideoTrdList.Remove(self);
inherited;
end;
procedure TVideoMulticastRecvThread.Execute;
var
s1,s2, sData : string;
fSize : integer;
nCount : integer;
begin
FUDPSocket := TUDPBlockSocket.Create();
FUDPSocket.CreateSocket;
FUDPSocket.Bind('0.0.0.0', MTVIDEOPORT); // 22401
FUDPSocket.AddMulticast( fMulticastIP ); //'234.5.6.7'
---> if FUDPSocket.LastError <> 0 then Exit;
//The above error verification code is well working in Window XP Home
version. However, in Window XP Professional version only one code is
created and an error occurs thereafter.
nCount := 0;
while ( not ThreadClose ) do
begin
FValue := FUDPSocket.RecvPacket(10);
if FUDPSocket.LastError = 0 then
inc(nCount);
OutputDebugString( Pchar( IntToStr( fNum )+ ' : ' + IntToStr( nCount ) ) );
sleep(100);
end;
FUDPSocket.Free;
end;
end.
=============================================================================
Execution Part
pprocedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
sMIP : string;
begin
Timer1.Enabled := true;
for i := 0 to 9 do
begin
case i of
0 : sMIP := '234.5.6.1';
1 : sMIP := '234.5.6.2';
2 : sMIP := '234.5.6.3';
3 : sMIP := '234.5.6.4';
4 : sMIP := '234.5.6.5';
5 : sMIP := '234.5.6.6';
6 : sMIP := '234.5.6.7';
7 : sMIP := '234.5.6.8';
8 : sMIP := '234.5.6.9';
9 : sMIP := '234.5.6.10';
end;
VideoThread := TVideoMulticastRecvThread.Create(i, sMIP );
Application.ProcessMessages;
sleep(100);
end;
end;
<!--CodeE-->
동일한 프로토콜, 동일한 포트로 2개 이상의 소켓을 열 수 없습니다.
TCP 22401, UDP 22401 이렇게는 열 수 있지만,
UDP 22401, UDP 22401 이렇게는 열 수 없습니다.
소켓은 하나만 여세요. 소켓에서 데이터를 받으면 상대방의 아이피를 알 수 있습니다.
이걸 이용해서 각각의 쓰레드에 데이터를 분배해주는 방식을 써보세요...
^^ 항상 즐코하세요...