simple-socket library 1.2.0
UnixSocket.cpp
Go to the documentation of this file.
1#include "UnixSocket.h"
2
3#include <sys/socket.h>
4#include <sys/un.h>
5#include <unistd.h>
6#include <cstring>
7
8using namespace NET;
9
10UnixSocket::UnixSocket( int type, int protocol)
11: SimpleSocket( UNIX, type, protocol)
12{}
13
14void UnixSocket::connect( std::string_view foreignPath)
15{
16 sockaddr_un addr;
17 fillAddress( foreignPath, addr);
18
19 if( ::connect( m_socket, (sockaddr*) &addr, sizeof(addr)) < 0)
20 throw SocketException("Connect failed (connect)");
21}
22
23void UnixSocket::bind( std::string_view localPath)
24{
25 sockaddr_un addr;
26 fillAddress( localPath, addr);
27 ::unlink( addr.sun_path);
28
29 if( ::bind( m_socket, (sockaddr*) &addr, sizeof(addr)) < 0)
30 throw SocketException("Set of local path failed (bind)");
31}
32
33std::string UnixSocket::getLocalPath() const
34{
35 sockaddr_un addr;
36 socklen_t addr_len = sizeof(addr);
37
38 if( getsockname( m_socket, (sockaddr*) &addr, &addr_len) < 0)
39 throw SocketException("Fetch of local path failed (getsockname)");
40
41 return extractPath( addr, addr_len);
42}
43
44std::string UnixSocket::getForeignPath() const
45{
46 sockaddr_un addr;
47 socklen_t addr_len = sizeof(addr);
48
49 if( getpeername( m_socket, (sockaddr*) &addr, &addr_len) < 0)
50 throw SocketException("Fetch of foreign path failed (getpeername)");
51
52 return extractPath( addr, addr_len);
53}
54
55void UnixSocket::fillAddress( std::string_view path, sockaddr_un& addr)
56{
57 const int len = path.length();
58 // needed space is size plus null character
59 if( len >= sizeof(sockaddr_un::sun_path)-1)
60 throw SocketException("Path to socket file is too long", false);
61
62 addr.sun_family = AF_LOCAL;
63 std::memcpy( addr.sun_path, path.data(), len);
64 addr.sun_path[len] = 0;
65}
66
67std::string UnixSocket::extractPath( const sockaddr_un& addr, socklen_t len)
68{
69 return std::string( addr.sun_path, len - sizeof(sa_family_t) - 1);
70}
static const int len
Definition CANFrame.h:7
Signals a problem with the execution of a socket call.
SimpleSocket(int sockfd)
enables return of an accepted socket
void connect(std::string_view foreignPath)
static std::string extractPath(const sockaddr_un &addr, socklen_t len)
extracts a path string from the socket address structure
static void fillAddress(std::string_view path, sockaddr_un &addr)
std::string getForeignPath() const
UnixSocket(int type, int protocol)
allows a subclass to create new socket
void bind(std::string_view localPath)
std::string getLocalPath() const