[muscle] Re: peer-to-peer help intro
- From: barry brant <bacondog835710@xxxxxxxxx>
- To: muscle@xxxxxxxxxxxxx
- Date: Mon, 2 May 2005 11:15:07 -0700 (PDT)
Thanks for all your help Jeremy. It seems I have
enough now to start working on it.
--- Jeremy Friesner <jaf@xxxxxxxxxxxx> wrote:
> Hi Barry,
>
> > Thanks for the fast reply Jeremy!
>
> Sure thing :^)
>
> > I am writing in C++ and though I learned it in
> > university, it's been quite a number of years
> since
> > I've touched it. I'm writing for Win32, and for
> my
> > first project I want to do a simple chat app
> > (peer-to-peer) where the IP addresses of both chat
> > clients are already known.
>
> So you are envisioning a text-chat application where
> it's always two people chatting with each other=3F
>
> > So I looked at BeShareAndMuscle.html and based on
> > that, viewed class Win32MessageTransceiverThread
> from
> > the API. It seems method AddNewConnectSession()
> will
> > connect to the IP and port of the other MUSCLE
> client
> > I want to do peer-to-peer with
>
> Assuming you do want the directly-connected 2-person
> model (i.e. with no server involved), then the above
> is half of the process. The other part of the
> equation is that when User A does an
> AddNewConnectSession() to initiate the TCP
> connection to User B, User B has to be already
> listening for that incoming TCP connection.
> (otherwise the TCP connection will be refused by
> User B's operating system)
>
> The simplest way to implement the
> listening-for-incoming-connections part is to have
> your program create (and run, via
> StartInternalThread()) an AcceptSocketsThread object
> at startup. That way, when someone tries to connect
> to your computer, the AcceptSocketsThread will
> accept the TCP connection, and send your main thread
> a Message containing the new connection's TCP
> socket, which you can then pass to
> MessageTransceiverThread::AddNewSession(int). At
> that point the TCP connection between the two
> computers' MessageTransceiverThread objects will be
> ready for use.
>
> But note that the above technique is actually a bit
> harder to get working than the client/server model
> of just having both clients connect to a muscled
> server and send Messages to each other through it --
> so you might want to consider just running muscled
> somewhere and having both clients connect to
> muscled, instead of trying to connect them directly
> to each other. Other advantages of using muscled as
> an intermediary include: the clients don't have to
> know each others' IP addresses in advance, and you
> can have more than 2 clients interacting with each
> other.
>
> > then I can get any
> > messages by looping for events through
> > GetNextEventFromInternalThread().
> > The event code will
> > tell me whether I have a Message object.
>
> That is correct.
>
> > For sending
> > messages, plainTextClient.cpp shows a method
> > "sendOutgoingMessage()" of
> MessageTransceiverThread
> > but I can't find that in the API. What do I do to
> > send a message=3F
>
> I think the method you are looking for is
>
> status=5Ft
>
MessageTransceiverThread::SendMessageToSessions(MessageRef
> myMsg, NULL).
>
> > For what I want to do, I can't believe it's this
> easy.
> >
> > One fundamental question I have is, is the same
> code
> > used for peer-to-peer as for client-server using
> > muscled=3F That is, instead of connecting
> directly to
> > your client in peer-to-peer, connect instead to
> the
> > server, pattern-match nodes for who to send to,
> but
> > then get or send messages in the same way. Is
> that
> > right=3F
>
> Yes, that is correct, the same
> *MessageTransceiverThread classes can be used to
> connect to muscled or to other clients. (Note,
> however, that pattern matching and all the various
> PR=5FCOMMAND=5F* stuff is only done by the server
> code -- so if you do a direct client-to-client
> connection you will get the ability to send and
> receive Messages to each other verbatim, but not any
> of the subscription or pattern-matching features)
>
> > What about client-server with subscriptions=3F
> The
> > Beginner's guide mentions how to set one up, but
> > doesn't mention how to subscribe.
>
> Subscribing is just a matter of sending a
> PR=5FCOMMAND=5FSETPARAMETERS Message to the muscled
> server with the proper field(s) in it...
> specifically, any field whose fieldname starts with
> the magic prefix "SUBSCRIBE:" followed by the path
> you want to subscribe to. As soon as the server
> receives the PR=5FCOMMAND=5FSETPARAMETERS Message,
> it will start sending you notifications.
>
> For example, to tell the server to start sending you
> notifications about what other clients are
> connected:
>
> MessageRef msg =3D
> GetMessageFromPool(PR=5FCOMMAND=5FSETPARAMETERS);
> msg()->AddBool("SUBSCRIBE:/*/*", true);
>
myMessageTransceiverThread->SendMessageToSessions(msg);
>
> .. and then the server will start sending you
> PR=5FRESULT=5FDATAITEMS Messages containing the
> requested information.
>
> > Are there some full samples of peer-to-peer and
> > client-server that I can study=3F I couldn't find
> any.
>
> Well, BeShare is a full example; it uses
> client-server for the chat and file-searches, and
> peer-to-peer for the actual file transfer. But it's
> perhaps too big/complex to be easily understandable,
> and it only runs under BeOS. FoxRabbitCarrot is an
> example of client/server code (it doesn't do any
> direct peer-to-peer connections though). It will
> run under Windows, but it uses Qt and not the Win32
> API directly (although the difference is minimal --
> basically it uses a QMessageTransceiverThread
> instead of a Win32MessageTransceiverThread)
>
> The testreflectclient.cpp program in the
> muscle/tests folder is an interactive
> command-line client that I use(d) to do quick tests
> of the muscled server; you
> might take a look at that. Unfortunately it was
> written to interface to the BeOS
> API instead of the Windows one, so it would take a
> little bit of tweaking to get
> it to compile and run under Windows (i.e. replacing
> the BMessageTransceiverThread
> with Win32MessageTransceiverThread, replacing the
> BLooper with the Win32
> API equivalent, etc).
>
> If you want, I can tweak testreflectclient.cpp to
> run under Windows next week (I'm at home right now
> so I don't have access to a Windows machine). Then
> you could play around with that as a trivial example
> app, and use it to get a feel as to how things work.
>
> -Jeremy
>
>
>
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
- Follow-Ups:
- [muscle] Re: peer-to-peer help intro
- From: Jeremy Friesner
- References:
- [muscle] Re: peer-to-peer help intro
- From: Jeremy Friesner
Other related posts:
- » [muscle] peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- » [muscle] Re: peer-to-peer help intro
- [muscle] Re: peer-to-peer help intro
- From: Jeremy Friesner
- [muscle] Re: peer-to-peer help intro
- From: Jeremy Friesner