// socket-file 0.9 // by // Steven L. Elliott // // A small C++ test program that illustrates Unix domain sockets. This program // has only been tested on Linux. // // Build : g++ -g socket-file.cpp -o socket-file // Indent : indent -gnu -nut -i4 -bli0 -npcs -nbad socket-file.cpp // C headers #include #include #include #include #include #include // C++ headers #include #include using namespace std; int main(int argc, char *argv[], char *envp[]) { int fd; struct sockaddr_un sa; string sfile; bool do_listen; if (argc != 3) { cerr << "Usage: " << argv[0] << " socket_file listen|connect" << endl; exit(1); } sfile = argv[1]; do_listen = !strcmp(argv[2], "listen"); sa.sun_family = AF_FILE; strcpy(sa.sun_path, sfile.c_str()); fd = socket(PF_FILE, SOCK_STREAM, 0); if (fd == -1) { cerr << "socket() failed. errno=" << errno << endl; exit(1); } if (do_listen) { if ((unlink(sfile.c_str()) == -1) && (errno != ENOENT)) { cerr << "Could not remove socket file " << sfile << ". errno=" << errno << endl; exit(1); } if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) { cerr << "bind() failed. errno=" << errno << endl; exit(1); } listen(fd, 5); struct sockaddr_storage conn_addr; socklen_t conn_addr_len = sizeof(conn_addr); int conn_fd = accept(fd, (struct sockaddr *) &conn_addr, &conn_addr_len); char abuff[200]; int rc; rc = recv(conn_fd, abuff, sizeof(abuff) - 1, 0); if (rc == -1) { cerr << "recv() failed. errno=" << errno << endl; exit(1); } abuff[rc] = 0; cout << "recv: " << abuff << endl; } else { if (connect(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) { cerr << "connect() failed. errno=" << errno << endl; exit(1); } stringstream to_send; to_send << "Sent by PID " << getpid(); string to_send_str = to_send.str(); if (send(fd, to_send_str.c_str(), to_send_str.length(), 0) == -1) { cerr << "Could not send. errno=" << errno << endl; exit(1); } cout << "send: " << to_send_str << endl; } close(fd); return 0; }