源码文件rtpsocketutil.h

/**
 * \file rtpsocketutil.h
 */

#ifndef RTPSOCKETUTIL_H

#define RTPSOCKETUTIL_H

#include "rtpconfig.h"
#ifdef RTP_SOCKETTYPE_WINSOCK
#include "rtptypes.h"
#endif // RTP_SOCKETTYPE_WINSOCK

namespace jrtplib
{

#ifndef RTP_SOCKETTYPE_WINSOCK

typedef int SocketType;

#else

typedef SOCKET SocketType;

#endif // RTP_SOCKETTYPE_WINSOCK

} // end namespace

#endif // RTPSOCKETUTIL_H

RTP_SOCKETTYPE_WINSOCK

通过该宏定义,决定当前是Windows系统还是Linux系统


int AddDestination(const RTPAddress &addr);

int RTPTCPTransmitter::AddDestination(const RTPAddress &addr)
{
	if (!m_init)
		return ERR_RTP_TCPTRANS_NOTINIT;
	
	MAINMUTEX_LOCK

	if (!m_created)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_TCPTRANS_NOTCREATED;
	}

	if (addr.GetAddressType() != RTPAddress::TCPAddress)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_TCPTRANS_INVALIDADDRESSTYPE;
	}

	const RTPTCPAddress &a = static_cast<const RTPTCPAddress &>(addr);
	SocketType s = a.GetSocket();
	if (s == 0)
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_TCPTRANS_NOSOCKETSPECIFIED;
	}

	int status = ValidateSocket(s);
	if (status != 0)
	{
		MAINMUTEX_UNLOCK
		return status;
	}
	
	std::map<SocketType, SocketData>::iterator it = m_destSockets.find(s);
	if (it != m_destSockets.end())
	{
		MAINMUTEX_UNLOCK
		return ERR_RTP_TCPTRANS_SOCKETALREADYINDESTINATIONS;
	}
	m_destSockets[s] = SocketData();

	// Because the sockets are also used for incoming data, we'll abort a wait
	// that may be in progress, otherwise it could take a few seconds until the
	// new socket is monitored for incoming data
	m_pAbortDesc->SendAbortSignal();

	MAINMUTEX_UNLOCK
	return 0;
}

 TCP传输的目的套接字保存在map表结构中

 const RTPTCPAddress &a = static_cast<const RTPTCPAddress &>(addr);

SocketType s = a.GetSocket();

获取到原始的套接字