VTrain/tools/rtsp_server/net/Pipe.cpp

96 lines
1.6 KiB
C++

// PHZ
// 2018-5-15
#include "Pipe.h"
#include "SocketUtil.h"
#include <random>
#include <string>
#include <array>
using namespace xop;
Pipe::Pipe()
{
}
Pipe::~Pipe()
{
Close();
}
bool Pipe::Create()
{
#if defined(WIN32) || defined(_WIN32)
TcpSocket rp(socket(AF_INET, SOCK_STREAM, 0)), wp(socket(AF_INET, SOCK_STREAM, 0));
std::random_device rd;
pipe_fd_[0] = rp.GetSocket();
pipe_fd_[1] = wp.GetSocket();
uint16_t port = 0;
int again = 5;
while(again--) {
port = rd();
if (rp.Bind("127.0.0.1", port)) {
break;
}
}
if (again == 0) {
return false;
}
if (!rp.Listen(1)) {
return false;
}
if (!wp.Connect("127.0.0.1", port)) {
return false;
}
pipe_fd_[0] = rp.Accept();
if (pipe_fd_[0] < 0) {
return false;
}
SocketUtil::SetNonBlock(pipe_fd_[0]);
SocketUtil::SetNonBlock(pipe_fd_[1]);
#elif defined(__linux) || defined(__linux__)
if (pipe2(pipe_fd_, O_NONBLOCK | O_CLOEXEC) < 0) {
return false;
}
#endif
return true;
}
int Pipe::Write(void *buf, int len)
{
#if defined(WIN32) || defined(_WIN32)
return ::send(pipe_fd_[1], (char *)buf, len, 0);
#elif defined(__linux) || defined(__linux__)
return ::write(pipe_fd_[1], buf, len);
#endif
}
int Pipe::Read(void *buf, int len)
{
#if defined(WIN32) || defined(_WIN32)
return recv(pipe_fd_[0], (char *)buf, len, 0);
#elif defined(__linux) || defined(__linux__)
return ::read(pipe_fd_[0], buf, len);
#endif
}
void Pipe::Close()
{
#if defined(WIN32) || defined(_WIN32)
closesocket(pipe_fd_[0]);
closesocket(pipe_fd_[1]);
#elif defined(__linux) || defined(__linux__)
::close(pipe_fd_[0]);
::close(pipe_fd_[1]);
#endif
}