当前位置:网站首页>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;
}
边栏推荐
- Altium designer 19.1.18 - change the transparency of copper laying
- Development tools -- gcc compiler usage
- Halcon's practice based on shape template matching [2]
- Some tips for using source insight (solve the problem of selecting all)
- Ads usage skills
- Screen record of the opening ceremony of the Beijing winter olympics 2
- Shape template matching based on Halcon learning [vi] find_ mirror_ dies. Hdev routine
- UEFI development learning 6 - creation of protocol
- How to select conductive slip ring
- Realization of binary relation of discrete mathematics with C language and its properties
猜你喜欢
Extended application of single chip microcomputer-06 independent key
研究發現,跨境電商客服系統都有這五點功能!
UEFI development learning 5 - simple use of protocol
UEFI development learning 2 - running ovmf in QEMU
Use of orbbec Astra depth camera of OBI Zhongguang in ROS melody
C WinForm [get file path -- traverse folder pictures] - practical exercise 6
Carrier period, electrical speed, carrier period variation
VESC Benjamin test motor parameters
Consul installation
How to migrate the device data accessed by the RTSP of the easycvr platform to easynvr?
随机推荐
The printer encountered an abnormal configuration problem 0x8007007e (win10)
Factors affecting the quality of slip rings in production
UEFI development learning series
Record the visual shock of the Winter Olympics and the introduction of the screen 2
C language uses arrays to realize the intersection, union, difference and complement of sets
通过sql语句统计特定字段出现次数并排序
Global and Chinese market of peeled bourdon tubes 2022-2028: Research Report on technology, participants, trends, market size and share
About yolov3, conduct map test directly
Measurement fitting based on Halcon learning [III] PM_ measure_ board. Hdev routine
C#,数值计算(Numerical Recipes in C#),线性代数方程的求解,LU分解(LU Decomposition)源程序
Measurement fitting based on Halcon learning [II] meaure_ pin. Hdev routine
Fundamentals of C language
Consul安装
Threads and processes
Cadence learning records
MySQL blind note common functions
Use stm32cubemx tool to write the demo program of FreeRTOS
assert_ Usage of param function
Embedded composition and route
Network communication process