bug-commoncpp
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: getPeer(tpport_t *port) and SocketPort for bound UDPSockets broken?


From: Wolfgang Alper
Subject: Re: getPeer(tpport_t *port) and SocketPort for bound UDPSockets broken?
Date: Tue, 6 Jan 2004 14:40:39 +0100
User-agent: KMail/1.5.4

I just wonder wether someone was able to confirm this issue with getPeer on 
UDP Socketports and/or wether anyone has an idea for a fix / workaround.


Regards

Wolfgang

Am Samstag, 27. Dezember 2003 22:49 schrieb Wolfgang:
> Hello Federico,
>
> well i called getPeer() within pending() . for my test, i did it every time
> in pending before calling receive().
> i know that datagram works connectionless in comparison to TCP based
> streamsockets.
>
> //using SocketPort:
> //doesn't return correct peer information for udpsocket
> //but works for tcpsockets
>       void pending(void) {
>               tpport_t mport; InetHostAddress ia = getPeer(&mport);
>               cout << "Remote Client: " << ia << ":" << mport << endl;
>               char buffer[1000]; int dlen; dlen = receive(buffer, 1000); 
> buffer[dlen] =
> '\0';
>               if (dlen > 0) {
>                       cout << "MySocketPort::pending. so: " << so << " 
> received: " << dlen <<
> "bytes. = " << buffer << endl;
>               }
>               else {
>                       cout << "MySocketPort::pending. so: " << so << " dlen 
> <= 0!: " << dlen
> << endl;
>                       //this is not the best way but for a simple test...
>                       delete this;
>               }
>       };
>
>
>
> then i did a test with a UDPSocket and called getPeer() after a packet
> arrived but before receive().
>
> //explicit server, explicit getPeer() call  - this works as it should
> pserver = new UDPSocket("127.0.0.1", 12345);
> pserver->setPeer("127.0.0.1", 11111);
>
> tpport_t mport; InetHostAddress ia = pserver->getPeer(&mport);
>               cout << "Remote Client: " << ia << ":" << mport << endl;
>               dlen = pserver->receive(buffer, 1000); buffer[dlen] = '\0';
>               if (dlen > 0) { cout << "pserver received: " << dlen << "bytes. 
> = " <<
> buffer << endl;}
>
>
> furthermore, i could imagine, that socketport does not use
> UDPSocket::getPeer but Socket::getPeer(). this would explain the behaviour.
>
> Best regards
>
> Wolfgang
>
> Am Samstag, 27. Dezember 2003 22:38 schrieb Federico Montesino Pouzols:
> >     Hi, do you see that broken behaviour with UDPSocket before
> > receiving any packet on the socket? UDPSocket::getPeer uses the
> > 'recvfrom' system call to retrieve the actual current peer the socket
> > is receiving from. If no packet has been received so far or is not
> > available, recvfrom will return 0. For an UDP socket, the peer is not
> > so clearly defined as for a TCP socket. I guess it would be helpful to
> > point this out in the SocketPort docs.
> >
> > On Sat, Dec 27, 2003 at 05:57:55AM +0100, Wolfgang wrote:
> > > Hello,
> > >
> > > when using getPeer(tpport_t *port) in a derived class from SocketPort
> > > using a CTOR for a bound UDPSocket, getPeer always returns 0.0.0.0:0
> > > (Adress and port eq 0).
> > > However when using an explicit UDPSocket, UDPSocket::getPeer works.
> > >
> > > Doing the same with SocketPort and a bound TCPSocket is not a problem.
> > >
> > > It seems that this is because UDPSocket overloads getPeer from Socket,
> > > which is not the case for TCPSocket. So SocketPort will not call
> > > UDPSocket::getPeer but Socket::getPeer (which works for TCPSocket's).
> > >
> > > Best regards
> > >
> > > Wolfgang
> > >
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Bug-commoncpp mailing list
> > > address@hidden
> > > http://mail.gnu.org/mailman/listinfo/bug-commoncpp
>
> _______________________________________________
> Bug-commoncpp mailing list
> address@hidden
> http://mail.gnu.org/mailman/listinfo/bug-commoncpp





reply via email to

[Prev in Thread] Current Thread [Next in Thread]