[asterisk-dev] Implementation using libpri and socketpair()

Paulo Garcia paulo.astdev at gmail.com
Wed Feb 7 16:41:43 MST 2007


Hi Christian,

I think I understand what you are saying but the data read comes directly
from libpri and I cannot realize how can I put some data before the package,
because I saw that into libpri there are two writes to my socket file
descriptor but in the read part (inside my program thread) there are only
one read with both packets togheter.

After I receive the packet from libpri, I can send it directly to my card
and the packet arrives at other side perfectly since my hardware already
prepared to do it. The only problem is when I get two packets joint
togheter.

I´m thinking if using another kind of interprocess communication I can avoid
this socketpair behaviour.

Thanks in advance!


Paulo




On 2/7/07, Christian <crich-ml at beronet.com> wrote:
>
> Hi Paulo,
>
> i have had similar issues with a quite different use-case ;-) the
> problem is that you need to frame your messages and transmit these
> frames instead of the transparent data. you can use hdlc for example, i
> believe there are some simple implementations out there, but that is
> sort of overkill. The most simple thing would be to just put the length
> of the frame before each packet, the length could be of maximum 4 bytes,
> then do a read of just as much bytes which you know from this length,
> like:
>
> uint32 len;
> char buf[1024];
> read(fd, &len, 4);
> read(fd,buf,len);
>
> then you can be sure that you've got only this single frame in buf,
> (well if read returns less then len you need to reread of course).
>
> Besides that i have somewhere read that you can set a HDLC Property via
> fcntl to terminals, but i haven't had ever the time to test that out.
>
>
> cheers,
>
> christian
>
>
> Paulo Garcia wrote:
> > Hi,
> >
> > in my own channel, I'm implementing ISDN support using Libpri. The
> > implementation is completely independent from zaptel then I'm trying
> > to do all communications between my hardware and libpri using
> > socketpair function.
> >
> > The idea is to create a socketpair, passing fd[0] to pri_new function
> > and writing to fd[1] to pass data to libpri. So far so good...
> >
> > To receive data from libpri, I have a thread checking for all file
> > descriptors fd[1] using select() function and when I receive
> > something, I pass it to my card. This approach also works well but
> > sometimes I receive two messages (from libpri) in only one read()
> > call. I think this is because of libpri writes two messages so fast
> > then when the read is called, there are already two messages in socket
> > buffer...
> >
> > How can I avoid this behavior? Maybe using another way different of
> > socketpair ? This communication will be used only inside the same
> > process, between different threads.
> >
> > Any path or idea will be appreciated.
> >
> >
> > Regards
> >
> >
> > Paulo Garcia
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > --Bandwidth and Colocation provided by Easynews.com --
> >
> > asterisk-dev mailing list
> > To UNSUBSCRIBE or update options visit:
> >    http://lists.digium.com/mailman/listinfo/asterisk-dev
> >
>
> _______________________________________________
> --Bandwidth and Colocation provided by Easynews.com --
>
> asterisk-dev mailing list
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digium.com/pipermail/asterisk-dev/attachments/20070207/438ce75a/attachment-0001.htm


More information about the asterisk-dev mailing list