当前位置:网站首页>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;
}
边栏推荐
- Function and usage of function pointer
- Shape template matching based on Halcon learning [vi] find_ mirror_ dies. Hdev routine
- A complete set of indicators for the 10000 class clean room of electronic semiconductors
- 如何进行导电滑环选型
- Acwing-宠物小精灵之收服-(多维01背包+正序倒序+两种形式dp求答案)
- Relationship between line voltage and phase voltage, line current and phase current
- Shape template matching based on Halcon learning [VII] reuse_ model. Hdev routine
- Shell脚本基本语法
- How to select conductive slip ring
- C language enhancement -- pointer
猜你喜欢
MySQL - storage engine
Carrier period, electrical speed, carrier period variation
Altium Designer 19.1.18 - 导入板框
Record the visual shock of the Winter Olympics and the introduction of the screen 2
Interview catalogue
Embedded AI intelligent technology liquid particle counter
Altium Designer 19.1.18 - 隐藏某一个网络的飞线
UEFI development learning 5 - simple use of protocol
Shell script basic syntax
Ads usage skills
随机推荐
Correlation based template matching based on Halcon learning [II] find_ ncc_ model_ defocused_ precision. hdev
C WinForm [display real-time time in the status bar] - practical exercise 1
Can't find real-time chat software? Recommend to you what e-commerce enterprises are using!
[professional literacy] core conferences and periodicals in the field of integrated circuits
Realization of binary relation of discrete mathematics with C language and its properties
Markdown tips
1089 Insert or Merge 含测试点5
Altium designer 19.1.18 - Import frame
assert_ Usage of param function
研究發現,跨境電商客服系統都有這五點功能!
A simple method to prove 1/t Fourier transform
Global and Chinese market for blood typing 2022-2028: Research Report on technology, participants, trends, market size and share
Factors affecting the quality of slip rings in production
C WinForm [help interface - send email] - practice five
Hardware 1 -- relationship between gain and magnification
C WinForm [realize the previous and next selection pictures] - practice 7
[untitled] record the visual shock of the Winter Olympics and the introduction of the display screen
Extended application of single chip microcomputer-06 independent key
Define in and define out
研究发现,跨境电商客服系统都有这五点功能!