Написал класс, для использования 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);
}