源码文件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();
获取到原始的套接字