generated from zhangwei/Matrixai
96 lines
1.6 KiB
C++
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
|
|
|
|
}
|