int GenericMediaServer::setUpOurSocket(UsageEnvironment& env, Port& ourPort) { int ourSocket = -1; do { // The following statement is enabled by default. // Don't disable it (by defining ALLOW_SERVER_PORT_REUSE) unless you know what you're doing. #if !defined(ALLOW_SERVER_PORT_REUSE) && !defined(ALLOW_RTSP_SERVER_PORT_REUSE) // ALLOW_RTSP_SERVER_PORT_REUSE is for backwards-compatibility ##### NoReuse dummy(env); // Don't use this socket if there's already a local server using it #endif ourSocket = setupStreamSocket(env, ourPort); if (ourSocket < 0) break; // Make sure we have a big send buffer: if (!increaseSendBufferTo(env, ourSocket, 50*1024)) break; // Allow multiple simultaneous connections: if (listen(ourSocket, LISTEN_BACKLOG_SIZE) < 0) { env.setResultErrMsg("listen() failed: "); break; } if (ourPort.num() == 0) { // bind() will have chosen a port for us; return it also: if (!getSourcePort(env, ourSocket, ourPort)) break; } return ourSocket; } while (0); if (ourSocket != -1) ::closeSocket(ourSocket); return -1; }
int RTSPServer::setUpOurSocket(UsageEnvironment& env, Port& ourPort) { int ourSocket = -1; do { ourSocket = setupStreamSocket(env, ourPort); if (ourSocket < 0) break; // Make sure we have a big send buffer: if (!increaseSendBufferTo(env, ourSocket, 50*1024)) break; // Allow multiple simultaneous connections: if (listen(ourSocket, LISTEN_BACKLOG_SIZE) < 0) { env.setResultErrMsg("listen() failed: "); break; } if (ourPort.num() == 0) { // bind() will have chosen a port for us; return it also: if (!getSourcePort(env, ourSocket, ourPort)) break; } return ourSocket; } while (0); if (ourSocket != -1) ::closeSocket(ourSocket); return -1; }
int HTTPSink::setUpOurSocket(UsageEnvironment& env, Port& ourPort) { int ourSocket = -1; do { ourSocket = setupStreamSocket(env, ourPort); if (ourSocket < 0) break; // Make sure we have a big send buffer: if (!increaseSendBufferTo(env, ourSocket, 50*1024)) break; if (listen(ourSocket, 1) < 0) { // we allow only one connection env.setResultErrMsg("listen() failed: "); break; } if (ourPort.num() == 0) { // bind() will have chosen a port for us; return it also: if (!getSourcePort(env, ourSocket, ourPort)) break; } return ourSocket; } while (0); if (ourSocket != -1) ::closeSocket(ourSocket); return -1; }
MP3HTTPSource* MP3HTTPSource::createNew(UsageEnvironment& env, NetAddress const& remoteAddress, Port remotePort, char const* remoteHostName, char const* fileName) { int ourSocket = -1; MP3HTTPSource* newSource = NULL; do { // Create a stream socket for this source. // Note: We don't make the socket non-blocking, because we want // to read from it synchronously (as we do with real file sources) ourSocket = setupStreamSocket(env, 0, False); if (ourSocket < 0) break; // Connect to the remote endpoint: MAKE_SOCKADDR_IN(remoteName, *(unsigned*)(remoteAddress.data()), remotePort.num()); if (connect(ourSocket, (struct sockaddr*)&remoteName, sizeof remoteName) != 0) { env.setResultErrMsg("connect() failed: "); break; } // Make sure we have a big receive buffer: if (!increaseReceiveBufferTo(env, ourSocket, 100*1024)) break; // Try to make the new socket into a FILE*: unsigned streamLength = 0; //##### FILE* fid = NULL; #if !defined(IMN_PIM) && !defined(CRIS) && !defined(_WIN32_WCE) fid = fdopen(ourSocket, "r+b"); #endif if (fid == NULL) { // HACK HACK HACK ##### // We couldn't convert the socket to a FILE*; perhaps this is Windoze? // Instead, tell the low-level to read it directly as a socket: long ourSocket_long = (long)ourSocket; fid = (FILE*)ourSocket_long; streamLength = (unsigned)(-1); } newSource = new MP3HTTPSource(env, fid); if (newSource == NULL) break; newSource->assignStream(fid, streamLength); // Write the HTTP 'GET' command: newSource->writeGetCmd(remoteHostName, ntohs(remotePort.num()), fileName); // Now read the first frame header, to finish initializing the stream: if (!newSource->initializeStream()) break; return newSource; } while (0); if (ourSocket != -1) ::closeSocket(ourSocket); Medium::close(newSource); return NULL; }