[Live-devel] Client IP address for RTSP streaming

Ross Finlayson finlayson at live555.com
Fri Jun 23 02:41:41 PDT 2023



> On Jun 23, 2023, at 1:03 AM, Willdoner Christian via live-devel <live-devel at us.live555.com> wrote:
> 
> I think it is a windows problem again..
> Finally I managed to filter out the IP with
>             char ipbuff[INET_ADDRSTRLEN];
>                         inet_ntop(clientAddr.ss_family, &(((struct sockaddr_in*)&clientAddr)->sin_addr), ipbuff, INET_ADDRSTRLEN);
> instead of the AddressString function.

FYI, this is the code that gets called (in our library: in “groupsock/NetAddress.cpp") to generate the string value of each address (“AddressString(addr).val()”):
	- For IPv4:
		fVal = new char[INET_ADDRSTRLEN];
  		inet_ntop(AF_INET, &addr, fVal, INET_ADDRSTRLEN);
	- For IPv6:
		fVal = new char[INET6_ADDRSTRLEN];
		inet_ntop(AF_INET6, &addr, fVal, INET6_ADDRSTRLEN);
I don’t know why that’s not working for you.


>  I have now an additional question: Is there also a function where it is detected that a client closes the stream similar to createNewClientConnection?

Yes.  Whenever the server detects that the connection is closed, it destroys the “RTSPClientConnection” object.  So, you can define your own subclass of “RTSPServer::RTSPClientConnection”, with its own destructor, e.g.,

	class myRTSPServer: public RTSPServer {
	...
	private:
		class myRTSPClientConnection: public RTSPServer::RTSPClientConnection {
			public:
				myRTSPClientConnection( params )
					: RTSPServer::RTSPClientConnection( params ) {}
				virtual ~myRTSPClientConnection() {
					// YOU KNOW THAT THE CONNECTION WAS CLOSED HERE
				}
		}
	};

You will also need to change your new “createNewClientConnection()” implementation to create (and return) an object of class “myRTSPClientConnection”, rather than just calling "RTSPServer::createNewClientConnection()” as you did before.


> Would it also be possible to detect if the client presses start/play in the media player i.e. not reopening a new connection?

Yes - define your own subclass of “RTSPServer::RTSPClientSession” (and also reimplement the virtual function “createNewClientSession()” to create and return an object of this new subclass).  Then reimplement the virtual function “handleCmd_PLAY()” in your new subclass - i.e.
	void myRTSPClientSession::handleCmd_PLAY( params ) {
		// Do whatever…
		RTSPClientSession::handleCmd_PLAY( params );
	}


Ross Finlayson
Live Networks, Inc.
http://www.live555.com/




More information about the live-devel mailing list