⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdserver.c

📁 早期freebsd实现
💻 C
字号:
#include <sys/types.h>#include <sys/socket.h>#include <sys/wait.h>#include <sys/uio.h>#include <sys/un.h>#include <stdio.h>#include <signal.h>#include <setjmp.h>#include <errno.h>struct	sockaddr_un sun;jmp_buf	j;int	catchsig();main(argc, argv)	char *argv[];{	int s, n;	char buf[BUFSIZ];	if (argc < 2) {		printf("usage: %s socket\n", argv[0]);		exit(1);	}	s = socket(AF_UNIX, SOCK_DGRAM, 0);	if (s < 0) {		perror("socket");		exit(1);	}	sun.sun_family = AF_UNIX;	strcpy(sun.sun_path, argv[1]);	if (bind(s, &sun, strlen(argv[1]) + 2) < 0) {		perror("fdserver: bind");		exit(1);	}	signal(SIGINT, catchsig);	signal(SIGTERM, catchsig);	signal(SIGPIPE, catchsig);	if (setjmp(j)) {		unlink(argv[1]);		exit(1);	}	for (;;) {		struct sockaddr_un from;		int fromlen = sizeof (from), f;		extern int errno;		n = recvfrom(s, buf, sizeof (buf), 0, &from, &fromlen);		if (n < 0) {			if (errno != EINTR)				perror("fdserver: recvfrom");			continue;		}		printf("Server: message received");		if (strlen(from.sun_path) > 0)			printf(" from %s", from.sun_path);		if (n > 0)			printf(" \"%.*s\"", n, buf);		putchar('\n'); fflush(stdout);		if (n > 0)			shake(s, buf);	}}catchsig(s)	int s;{	psignal(s, "Server");	longjmp(j, 1);}shake(s, name)	int s;	char *name;{	char buf[BUFSIZ], filename[BUFSIZ];	struct msghdr msg;	struct iovec iov[1];	struct sockaddr_un to, *sun = &to;	int newfd = -1, n;	strcpy(buf, "gotcha...");	sun->sun_family = AF_UNIX;	strcpy(sun->sun_path, name);	n = sizeof (sun->sun_family) + strlen(sun->sun_path);	printf("Server: send ack\n"); fflush(stdout);	if (sendto(s, buf, strlen(buf), 0, sun, n) < 0) {		perror("fdserver: sendto");		return;	}#ifdef dataonly	newfd = sizeof (to);	n = recvfrom(s, buf, sizeof (buf), 0, sun, n);	if (n < 0) {		perror("fdserver: recvfrom");		return;	}	printf("Server: recvfrom %d, from %s, buf \"%.*s\"\n", n,	    sun->sun_path, n, buf);#else	msg.msg_name = (caddr_t)sun;	msg.msg_namelen = sizeof (*sun);	iov->iov_base = filename;	iov->iov_len = sizeof (filename);	msg.msg_iov = iov;	msg.msg_iovlen = 1;	msg.msg_accrights = (caddr_t)&newfd;	msg.msg_accrightslen = sizeof (newfd);	n = recvmsg(s, &msg, 0);	if (n < 0) {		perror("fdserver: recvmsg");		return;	}	printf("Server: received file");	if (iov->iov_len > 0)		printf(" \"%.*s\", fd %d", iov->iov_len, iov->iov_base, newfd);	if (strlen(sun->sun_path) > 0)		printf(" from %s", sun->sun_path);	printf("; n %d\n", n); fflush(stdout);	if (n <= 0 || newfd < 0 || newfd >= getdtablesize())		printf("fdserver: bad new fd %d\n", newfd);	else {		printf("Server: file contents:\n");		while ((n = read(newfd, buf, sizeof (buf))) > 0)			write(1, buf, n);		close(newfd);	}#endif/*	strcpy(buf, "thank you...");	strcpy(sun->sun_path, name);	n = sizeof (sun->sun_family) + strlen(sun->sun_path);	printf("Server: send thank you\n"); fflush(stdout);	if (sendto(s, buf, strlen(buf), 0, sun, n) < 0)		perror("fdserver: sendto");*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -