// This class is (c) 1998 by Ron Harvest. // Use freely, but give credit to me as the originator. #include #include #include "server.h" #include server::server(char *host, unsigned long port) { inbuf = 0; bzero(buf,BUFSIZE+1); if((soc = connectto(host,port)) == -1) { fprintf(stderr, "Cannot connect to host \"%s\"\n", host); exit(1); } } int server::sockfd() { return soc; } // Takes a hostname and a port number and returns a socket, or -1 if // failed to connect int server::connectto(char *host, unsigned long port) { struct sockaddr_in peer; struct hostent *hp; int soc; // Get peer's address hp = gethostbyname(host); if (hp==NULL) return -1; peer.sin_family = AF_INET; peer.sin_port = htons(port); bcopy(hp->h_addr_list[0],(char *)&peer.sin_addr,hp->h_length); // Create socket soc = socket(AF_INET,SOCK_STREAM,0); // Connect to server if (connect(soc, (struct sockaddr *)&peer, sizeof(peer))==-1) { close(soc); return -1; } else return soc; } server::~server() { close(soc); } int server::noFullLine() { buf[BUFSIZE] = 0; char *t = index(buf,'\n'); return ( !t ) || ( t > (buf + inbuf - 1) ); } void server::readport() { int newdata; char *kills; fd_set fds, efds; while ( (inbuf < BUFSIZE) && noFullLine() ) { bzero(&fds,sizeof(fd_set)); FD_SET(soc, &fds); bzero(&efds,sizeof(fd_set)); FD_SET(soc, &efds); select(soc+1, &fds, 0, &efds, 0); if ( FD_ISSET(soc, &fds) ) { newdata = read(soc, buf+inbuf, BUFSIZE-inbuf); int removed = 0; for (int i = inbuf; i < inbuf+newdata-removed; i++) { if ((buf[i] == '\r') || (buf[i] == 0)) { memmove(buf+i, buf+i+1, BUFSIZE-i-1); buf[BUFSIZE-1] = 0; i--; removed++; } } inbuf += newdata; inbuf -= removed; } } } char *server::returnWholeBuffer() { char *ret = strdup(buf); bzero(buf, BUFSIZE+1); inbuf = 0; return ret; } char *server::nextline() { char *ret; char *nnline; // Find the first newline while (noFullLine()) { if (inbuf >= BUFSIZE) return returnWholeBuffer(); readport(); } nnline = index(buf,'\n'); // Copy everything up to the first newline to the return ret = (char *)malloc(nnline-buf+1); ret[nnline-buf] = 0; bzero(ret,nnline-buf+1); strncpy(ret,buf,nnline-buf); // Don't copy newline, leave spot zeroed inbuf -= nnline+1-buf; char *newstart = nnline + 1; memmove(buf, newstart, strlen(newstart)+1); return ret; } int server::writeport(char *fmtstring, ...) { va_list ap; fd_set fds; char text[1024]; bzero(text, 1024); va_start(ap,fmtstring); vsprintf(text,fmtstring,ap); va_end(ap); bzero(&fds, sizeof(fd_set)); FD_SET(soc,&fds); select(soc+1,0,&fds,0,0); write(soc,text,strlen(text)-1); bzero(&fds, sizeof(fd_set)); FD_SET(soc,&fds); select(soc+1,0,&fds,0,0); write(soc,"\r\n",2); }