当前位置:网站首页>Live555 RTSP audio and video streaming summary (II) modify RTSP server streaming URL address
Live555 RTSP audio and video streaming summary (II) modify RTSP server streaming URL address
2022-07-05 08:00:00 【Drink more hot water-】
do RTSP server when , No matter what TCP/UDP, We all need to know streaming From which port , The binding of IP What's the address .
live555 There is a default to find the local network card IP Methods :
Get our address by sending a (0-TTL) multicast packet,
receiving it, and looking at the source address used.
(This is kinda bogus, but it provides the best guarantee
that other nodes will think our address is the same as we do.)
It's actually sending a TTL Package to local boardcast, Then resolve the return address of the Group , What you get is this machine IP.
however , One drawback of this is , It always returns the address of the default gateway , When we have multiple network cards , such as wlan0 wlan1 eth0 etc. ,
Suppose the default routing table points to wlan0, But we want to pass wlan1 Push flow , At this time, the mechanism will have problems .
So find this place directly , take IP Write the address as we want .
GroupsockHelper.cpp , You can start from 10.254.1.0 Push the stream
netAddressBits ourIPAddress(UsageEnvironment& env) {
static netAddressBits ourAddress = 0;
int sock = -1;
struct in_addr testAddr;
if (ReceivingInterfaceAddr != INADDR_ANY) {
// Hack: If we were told to receive on a specific interface address, then
// define this to be our ip address:
ourAddress = ReceivingInterfaceAddr;
}
if (ourAddress == 0) {
// We need to find our source address
struct sockaddr_in fromAddr;
fromAddr.sin_addr.s_addr = 0;
// Get our address by sending a (0-TTL) multicast packet,
// receiving it, and looking at the source address used.
// (This is kinda bogus, but it provides the best guarantee
// that other nodes will think our address is the same as we do.)
do {
loopbackWorks = 0; // until we learn otherwise
testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary
Port testPort(15947); // ditto
sock = setupDatagramSocket(env, testPort);
if (sock < 0) break;
if (!socketJoinGroup(env, sock, testAddr.s_addr)) break;
unsigned char testString[] = "hostIdTest";
unsigned testStringLength = sizeof testString;
if (!writeSocket(env, sock, testAddr, testPort.num(), 0,
testString, testStringLength)) break;
// Block until the socket is readable (with a 5-second timeout):
fd_set rd_set;
FD_ZERO(&rd_set);
FD_SET((unsigned)sock, &rd_set);
const unsigned numFds = sock+1;
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
int result = select(numFds, &rd_set, NULL, NULL, &timeout);
if (result <= 0) break;
unsigned char readBuffer[20];
int bytesRead = readSocket(env, sock,
readBuffer, sizeof readBuffer,
fromAddr);
if (bytesRead != (int)testStringLength
|| strncmp((char*)readBuffer, (char*)testString, testStringLength) != 0) {
break;
}
// We use this packet's source address, if it's good:
// loopbackWorks = !badAddressForUs(fromAddr.sin_addr.s_addr);
loopbackWorks = !badAddressForUs(our_inet_addr("10.254.1.0"));// gw
} while (0);
if (sock >= 0) {
socketLeaveGroup(env, sock, testAddr.s_addr);
closeSocket(sock);
}
if (!loopbackWorks) do {
// We couldn't find our address using multicast loopback,
// so try instead to look it up directly - by first getting our host name, and then resolving this host name
char hostname[100];
hostname[0] = '\0';
int result = gethostname(hostname, sizeof hostname);
if (result != 0 || hostname[0] == '\0') {
env.setResultErrMsg("initial gethostname() failed");
break;
}
// Try to resolve "hostname" to an IP address:
NetAddressList addresses(hostname);
NetAddressList::Iterator iter(addresses);
NetAddress const* address;
// Take the first address that's not bad:
netAddressBits addr = 0;
while ((address = iter.nextAddress()) != NULL) {
netAddressBits a = *(netAddressBits*)(address->data());
if (!badAddressForUs(a)) {
addr = a;
break;
}
}
// Assign the address that we found to "fromAddr" (as if the 'loopback' method had worked), to simplify the code below:
fromAddr.sin_addr.s_addr = addr;
} while (0);
// Make sure we have a good address:
// netAddressBits from = fromAddr.sin_addr.s_addr;
netAddressBits from = (our_inet_addr("169.254.1.0"));
if (badAddressForUs(from)) {
char tmp[100];
sprintf(tmp, "This computer has an invalid IP address: %s", AddressString(from).val());
env.setResultMsg(tmp);
from = 0;
}
ourAddress = from;
// Use our newly-discovered IP address, and the current time,
// to initialize the random number generator's seed:
struct timeval timeNow;
gettimeofday(&timeNow, NULL);
unsigned seed = ourAddress^timeNow.tv_sec^timeNow.tv_usec;
our_srandom(seed);
}
return ourAddress;
}
边栏推荐
- Global and Chinese markets for flexible endoscopic lithotripsy devices 2022-2028: Research Report on technology, participants, trends, market size and share
- 如何进行导电滑环选型
- Screen record of the opening ceremony of the Beijing winter olympics 2
- mysql 盲注常见函数
- Shell script basic syntax
- Extern keyword function
- VESC Benjamin test motor parameters
- Cadence learning records
- Carrier period, electrical speed, carrier period variation
- Global and Chinese market of digital shore durometer 2022-2028: Research Report on technology, participants, trends, market size and share
猜你喜欢
研究發現,跨境電商客服系統都有這五點功能!
C # joint configuration with Halcon
Consul安装
C WinForm [help interface - send email] - practice five
Network port usage
MySQL blind note common functions
Ads usage skills
L'étude a révélé que le système de service à la clientèle du commerce électronique transfrontalier a ces cinq fonctions!
Shape template matching based on Halcon learning [viii] PM_ multiple_ models. Hdev routine
Factors affecting the quality of slip rings in production
随机推荐
Screen record of the opening ceremony of the Beijing winter olympics 2
Threads and processes
Markdown tips
C language enhancement -- pointer
Altium Designer 19.1.18 - 更改铺铜的透明度
Record the visual shock of the Winter Olympics and the introduction of the screen 2
Detailed explanation of pragma usage
Random function usage notes
Ads learning record (lna_atf54143)
Good websites need to be read carefully
Embedded AI intelligent technology liquid particle counter
Can't find real-time chat software? Recommend to you what e-commerce enterprises are using!
How to define guid in AMI code
Programming knowledge -- basis of C language
Altium designer 19.1.18 - Import frame
Detailed explanation of C language pointer
STM32 learning method
Reasons for rapid wear of conductive slip rings
1-stm32 operation environment construction
Win10 shortcut key