unix域套接口示例程序

服务端示例:

#include #include #include #include #include #include #include #include #define UNIX_DOMAIN_PATH "/tmp/UNIX.domain" #define MAXBUFSIZE 1024 #define LISTENQ 10 #define LOG_FILE_PATH "/tmp/UNIX.log" int main() { int listenfd; int connfd; int len; int ret; pid_t childpid; struct sockaddr_un cliaddr; socklen_t cliaddr_len; struct sockaddr_un servaddr; listenfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (listenfd < 0) { perror("cannot create listening socket"); return -1; } unlink(UNIX_DOMAIN_PATH); bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_LOCAL; strncpy(servaddr.sun_path, UNIX_DOMAIN_PATH, sizeof(servaddr.sun_path)-1); ret = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret == -1) { perror("cannot bind server socket"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } ret = listen(listenfd, LISTENQ); if (ret == -1) { perror("cannot listen the client connect request"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return 1; } while (1) { len = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len); if (connfd < 0) { if (errno == EINTR) { continue; } else { perror("cannot accept the client connect request"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } } if ((childpid = fork()) < 0) { perror("cannot create child process"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } else if (childpid == 0) { ret = server_accept(connfd); exit(ret); } else { close(connfd); } } close(listenfd); unlink(UNIX_DOMAIN_PATH); return 0; } int server_accept(int sockfd) { ssize_t n; char buf[MAXBUFSIZE]; time_t timestamp; FILE *fp; memset(buf, 0, sizeof(buf)); fp = fopen(LOG_FILE_PATH, "a"); if (fp == NULL) { perror("fopen log file"); return -1; } again: while ((n = recv(sockfd, buf, MAXBUFSIZE, 0)) > 0) { buf[n] = '/n'; buf[n+1] = '/0'; strcpy(buf+21, buf); timestamp = time(NULL); strftime(buf, 20, "%Y-%m-%d %H:%M:%S", localtime(×tamp)); buf[19] = ':'; buf[20] = ' '; if (fputs(buf, fp)) { perror("fputs log file"); return -1; } } if (n<0 && errno==EINTR) { goto again; } else if (n < 0) { perror("recv connfd msg"); return -1; } close(sockfd); fclose(fp); return 0; }

 

 

 

客户端示例:

#include #include #include #include #include #include #include #include #define UNIX_DOMAIN_PATH "/tmp/UNIX.domain" #define MAXBUFSIZE 1024 int main() { int connfd; int ret; char buf[MAXBUFSIZE]; static struct sockaddr_un servaddr; connfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (connfd < 0) { perror("cannot create connect socket"); return -1; } servaddr.sun_family = AF_LOCAL; strncpy(servaddr.sun_path, UNIX_DOMAIN_PATH, sizeof(servaddr.sun_path)-1); ret = connect(connfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); if (ret == -1) { perror("cannot connect to the server"); return -1; } memset(buf, 0, MAXBUFSIZE); strcpy(buf, "client"); if (send(connfd, buf, strlen(buf), 0) == -1) { perror("cannot send msg to the server"); return -1; } close(connfd); return 0; }

你可能感兴趣的:(网络技术,unix,path,domain,struct,socket,server)