← index
cplusplus11.Examples/UNIX/network/af_unix-stream-client.cpp
Source: cplusplus11.Examples/UNIX/network/af_unix-stream-client.cpp
/* Adapted from "the Linux Programming Interface"
 Chapter 57
 */
#include<iostream>
#include<sys/un.h>
#include<sys/socket.h>
#include<string>
#include<cstring>
#include<errno.h>
#include<unistd.h>

const char *SOCK_PATH = "/tmp/testsock";
const int BUF_SIZE=256;

void error(const std::string &text, bool err_no = true);


int main() {

    sockaddr_un addr;
    int sockfd;
    
    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(sockfd == -1)
        error("socket");
    
    memset(&addr, 0, sizeof(sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) -1);
    
    if(connect(sockfd, (sockaddr *)&addr, sizeof(sockaddr_un)) == -1)
        error("connect");
    
    ssize_t bytesRead;
    char buf[BUF_SIZE];
    
    while((bytesRead = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
        if(write(sockfd, buf, bytesRead) != bytesRead)
            error("partial write", false);
    
    if(bytesRead == -1)
        error("read");
    
    return EXIT_SUCCESS;
}

void error(const std::string &text, bool err_no) {
    std::cerr << "Error: " << text << "\n";
    if(err_no) std::cerr << strerror(errno) << "\n";
}