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

📄 net.c

📁 操作系统源代码
💻 C
字号:
/* net.c Copyright Michael Temari 08/01/1996 All Rights Reserved */#include <sys/types.h>#include <sys/ioctl.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <signal.h>#include <net/netlib.h>#include <net/hton.h>#include <net/gen/netdb.h>#include <net/gen/in.h>#include <net/gen/inet.h>#include <net/gen/tcp.h>#include <net/gen/tcp_io.h>#include <net/gen/udp.h>#include <net/gen/udp_io.h>#include <net/gen/udp_hdr.h>#include "talk.h"#include "net.h"_PROTOTYPE(void TimeOut, (int sig));static unsigned char buffer[8192];static int udp_ctl;int tcp_fd;static udpport_t ntalk_port;char luser[USER_SIZE+1], ruser[USER_SIZE+1];char lhost[HOST_SIZE+1], rhost[HOST_SIZE+1];char ltty[TTY_SIZE+1], rtty[TTY_SIZE+1];udpport_t ctlport;tcpport_t dataport;ipaddr_t laddr, raddr;int NetInit(){int s;struct servent *servent;char *udp_device;char *tcp_device;nwio_udpopt_t udpopt;nwio_tcpconf_t tcpconf;   if((udp_device = getenv("UDP_DEVICE")) == (char *)NULL)   	udp_device = UDP_DEVICE;   if((udp_ctl = open(udp_device, O_RDWR)) < 0) {   	fprintf(stderr, "talk: Could not open %s: %s\n",   		udp_device, strerror(errno));   	return(-1);   }   if((servent = getservbyname("ntalk", "udp")) == (struct servent *)NULL) {   	fprintf(stderr, "talk: Could not find ntalk udp service\n");   	close(udp_ctl);   	return(-1);   }   ntalk_port = (udpport_t)servent->s_port;   udpopt.nwuo_flags = NWUO_NOFLAGS;   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SEL | NWUO_EN_LOC;   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET;   udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT;   udpopt.nwuo_remaddr = raddr;   udpopt.nwuo_remport = ntalk_port;   s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt);   if(s < 0) {   	perror("talk: ioctl NWIOSUDPOPT");   	close(udp_ctl);   	return(-1);   }   s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt);   if(s < 0) {   	perror("talk: ioctl NWIOGUDPOPT");   	close(udp_ctl);   	return(-1);   }   laddr = udpopt.nwuo_locaddr;   ctlport = udpopt.nwuo_locport;   if((tcp_device = getenv("TCP_DEVICE")) == (char *)NULL)   	tcp_device = TCP_DEVICE;   if((tcp_fd = open(tcp_device, O_RDWR)) < 0) {   	fprintf(stderr, "talk: Could not open %s: %s\n",   		tcp_device, strerror(errno));   	close(udp_ctl);   	return(-1);   }   tcpconf.nwtc_flags = NWTC_NOFLAGS;   tcpconf.nwtc_flags |= NWTC_LP_SEL | NWTC_SET_RA | NWTC_UNSET_RP;   tcpconf.nwtc_remaddr = raddr;   s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf);   if(s < 0) {   	perror("talk: ioctl NWIOSTCPCONF");   	close(udp_ctl);   	close(tcp_fd);   	return(-1);   }   s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf);   if(s < 0) {   	perror("talk: ioctl NWIOGTCPCONF");   	close(udp_ctl);   	close(tcp_fd);   	return(-1);   }   dataport = tcpconf.nwtc_locport;   return(0);}int getreply(reply, timeout)struct talk_reply *reply;int timeout;{int s;int terrno;udp_io_hdr_t *udp_io_hdr;   signal(SIGALRM, TimeOut);   alarm(timeout);   s = read(udp_ctl, buffer, sizeof(buffer));   terrno = errno;   alarm(0);   errno = terrno;   if(s < 0 && errno == EINTR)   	return(1);   if(s < 0) {   	perror("talk: Read error in getreply");   	return(-1);   }   if(s == sizeof(struct talk_reply))	memcpy((char *)reply, buffer, s);   return(0);}int sendrequest(request, here)struct talk_request *request;int here;{int s;nwio_udpopt_t udpopt;udp_io_hdr_t *udp_io_hdr;   udpopt.nwuo_flags = NWUO_NOFLAGS;   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC;   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET;   udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT;   udpopt.nwuo_locport = ctlport;   if(here)	udpopt.nwuo_remaddr = laddr;   else	udpopt.nwuo_remaddr = raddr;   udpopt.nwuo_remport = ntalk_port;   s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt);   if(s < 0) {   	perror("talk: ioctl NWIOSUDPOPT");   	return(-1);   }   s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt);   if(s < 0) {   	perror("talk: ioctl NWIOGUDPOPT");   	return(-1);   }   s = write(udp_ctl, request, sizeof(struct talk_request));   if(s < 0) {   	perror("talk: write error in sendrequest");   	return(-1);   }   if(s != sizeof(struct talk_request)) {   	fprintf(stderr, "talk: sendrequest size mismatch %d %d\n", s, sizeof(struct talk_request));   	return(-1);   }   return(0);}void TimeOut(sig)int sig;{}int NetConnect(port)u16_t port;{int s;nwio_tcpconf_t tcpconf;nwio_tcpcl_t tcpcopt;   tcpconf.nwtc_flags = NWTC_NOFLAGS;   tcpconf.nwtc_flags |= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP;   tcpconf.nwtc_locport = dataport;   tcpconf.nwtc_remaddr = raddr;   tcpconf.nwtc_remport = port;   s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf);   if(s < 0) {   	perror("talk: ioctl NWIOSTCPCONF");   	return(-1);   }   s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf);   if(s < 0) {   	perror("talk: ioctl NWIOGTCPCONF");   	return(-1);   }   tcpcopt.nwtcl_flags = 0;   s = ioctl(tcp_fd, NWIOTCPCONN, &tcpcopt);   if(s < 0 && errno == ECONNREFUSED)   	return(1);   if(s < 0) {   	perror("talk: ioctl NWIOTCPCONN");   	return(-1);   }   return(0);}int NetListen(timeout)int timeout;{int s;nwio_tcpcl_t tcplopt;int terrno;   tcplopt.nwtcl_flags = 0;   signal(SIGALRM, TimeOut);   alarm(timeout);   s = ioctl(tcp_fd, NWIOTCPLISTEN, &tcplopt);   terrno = errno;   alarm(0);   errno = terrno;   if(s < 0 && errno == EINTR)   	return(1);   if(s < 0) {   	perror("talk: ioctl NWIOTCPLISTEN");   	return(-1);   }   return(0);}

⌨️ 快捷键说明

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