服务器 发布日期:2024/12/29 浏览次数:1
仅供参考:
服务端:socket->bind->listen->send/recv->close
客户端:socket->bind->connect->send/recv->close
#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <fcntl.h> #include <sys/un.h> #include <pthread.h> #include <cstring> #include <cstdio> #include <unistd.h> #include <signal.h> #define filename "test.socket" void setnonblocking(int fd) { fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); } void *client_func(void *arg) { sleep(3); int fd = socket(AF_UNIX, SOCK_STREAM, 0); setnonblocking(fd); sockaddr_un un; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; sprintf(un.sun_path, "file_%d.socket", (int)getpid()); unlink(un.sun_path); socklen_t len = sizeof(un); bind(fd, (sockaddr *)&un, sizeof(un)); strcpy(un.sun_path, filename); int ret = connect(fd, (sockaddr *)&un, len); if (ret == -1) { printf("connect server failed...\n"); close(fd); return NULL; } char buf[256]; memset(buf, 0, sizeof(buf)); strcpy(buf, "hello world"); int n = send(fd, buf, strlen(buf)+1, 0); printf("send data, %d bytes..\n", n); sleep(5); close(fd); return NULL; } int main() { unlink(filename); signal(SIGPIPE, SIG_IGN); int fd = socket(AF_UNIX, SOCK_STREAM, 0); int yes = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); setnonblocking(fd); sockaddr_un un; memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; strcpy(un.sun_path, filename); bind(fd, (sockaddr *)&un, sizeof(un)); listen(fd, 100); pthread_t pid; pthread_create(&pid, NULL, client_func, NULL); sockaddr_un uu; socklen_t len = sizeof(uu); while (true) { memset(&uu, 0, len); int newfd = accept(fd, (sockaddr *)&uu, &len); if (newfd != -1) { setnonblocking(newfd); printf("newfd = %d, path = %s\n", newfd, uu.sun_path); char buf[512]; memset(buf, 0, sizeof(buf)); int n = recv(newfd, buf, 512,0); printf("recv %d bytes, contents is %s\n", n, buf); } usleep(100000); } close(fd); return 0; }
以上就是小编为大家带来的socket unix domain IPC的实例代码全部内容了,希望大家多多支持~