Написал класс, для использования sockcetpair, могу отправить сообщение только в одну сторону

Пытаюсь написать класс, для работы с socket pair, мдея в том, чтоб с обоих сторон можно было читать и отправлять сообщения с помощью вызова send/write у объекта класса(в дочерний процесс объект класса передается в качестве параметра функции, передаваемой в конструктор класса SocketPair). Проблема в том, что отправить сообщение может только одна из сторон. В случае, если обе стороны отправили сообщения, read , блокируется одна или обе стороны. Не могу понять, почему так происходит. Вот код класса.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <functional>
#include <vector>
#include <unistd.h>
#include <string.h>
class SocketPair
{
public:
    SocketPair(std::function<void(SocketPair& socket)> func);
    SocketPair(std::string path);
    ~SocketPair();
    bool Send(const std::string& buf);
    bool Send(const char* buf);
    bool SendDescriptor(int fd);
    std::string* Receive();
    int ReceiveDescriptor();
private:
    int socket;
};

Реализация

 SocketPair::SocketPair(std::function<void(SocketPair& socket)> func){
             int temp[2];
             socketpair(AF_LOCAL, SOCK_STREAM, 0, temp);
             pid_t process = fork();
             if (process < 0){
                 throw "Error fork";
             }
             else if(process == 0){
                 close(temp[0]);
                 socket = dup(temp[1]);
                 func(*this);
             }
             else{
                 close(temp[1]);
                 socket = dup(temp[0]);
             }
        }
        SocketPair::~SocketPair(){
            close(socket);
        }

        bool SocketPair::Send(const std::string& buf){
            if (write(socket, buf.c_str(), buf.length()) > 0)
                return true;
            else
                return false;
        }


        bool SocketPair::Send(const char* buf){
            if (write(socket, buf, strlen(buf)) > 0)
                return true;
            else
                return false;

        }


        std::string* SocketPair::Receive(){
            std::string* result = new std::string;

            while(1){
                char buf[1024];
                auto size = read(socket, buf, 1024);
                if (size == 0)
                    break;
                else if (size < 0)
                    return nullptr;
                else{
                    buf[size] = '\0';

                    *result+= buf;
                }
            }
            return result;
        }

Main

int main(){
    SocketPair mainProcess([&](SocketPair mainProcess){
        std::string test = "test";
        mainProcess.Send(test);
        std::cout << *mainProcess.Receive() << std::endl;

    });
    std::string echo = *mainProcess.Receive();
    std::cout << *mainProcess.Receive() << std::endl;
    mainProcess.Send(echo);
}

Ответы (0 шт):