/***********************************************************************/ /* Course: Computer Science 402a */ /* Assignment: Assignment 1 */ /* Instructor: Mark Giesbrecht */ /* Submitted by: Dan Fraser */ /* Student Number: 001219229 */ /* Due Date: Wednesday, February 16 */ /***********************************************************************/ /* StreamSocket.cc -- Implementation of the socket wrapper class */ /***********************************************************************/ #include "StreamSocket.h" StreamSocket::StreamSocket() { sock = ::socket(AF_INET, SOCK_STREAM,0); if (sock < 0) { perror("opening stream socket"); exit(1); } } int StreamSocket::bind(int port = 0) { server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = port; if (::bind(sock, (sockaddr *)&server, sizeof(server))) { perror("bind"); return -1; } else { int length = sizeof(server); if (getsockname(sock, (sockaddr *)&server, &length)) { perror("getting sock name"); return -1; } return ntohs(server.sin_port); } } int StreamSocket::connect(string hostname, int port) { int rc; server.sin_family = AF_INET; hp = ::gethostbyname(hostname.c_str()); if (hp == 0) { cout << hostname << ": unknown host" << endl; exit(1); } bcopy(hp->h_addr, &server.sin_addr, hp->h_length); server.sin_port = htons(port); if ((rc = ::connect(sock,(sockaddr *)&server, sizeof(server))) < 0) { perror("connecting stream socket"); return rc; } else { return rc; } } int StreamSocket::send(void *data, int length) { int rc; if ((rc = ::write(sock, data, length)) < 0) { perror("writing on stream socket"); return rc; } else { return rc; } } int StreamSocket::send(string data) { int rc; if ((rc = ::write(sock, data.c_str(), data.length())) < 0) { perror("writing on stream socket"); return rc; } else { return rc; } } int StreamSocket::send(int to, void *data, int length) { int rc; if ((rc = ::write(to, data, length)) < 0) { perror("writing on stream socket"); return rc; } else { return rc; } } int StreamSocket::disconnect(int socket = 0) { if (socket) { ::close(socket); } else { ::close(sock); } return 0; } int StreamSocket::listen(int qsize) { ::listen(sock, qsize); return 0; } int StreamSocket::accept() { int msgsock; int length; length = sizeof(remote); msgsock = ::accept(sock,(sockaddr *)&remote,&length); if (msgsock == -1) { perror("accept"); return msgsock; } else { return msgsock; } } int StreamSocket::receive(void *data, int length) { int rc; bzero(data, length); if ((rc = ::read(sock, data, length)) < 0) { perror("reading from stream socket"); return rc; } else { return rc; } } int StreamSocket::receive(int from, void *data, int length) { int rc; bzero(data,length); if ((rc = read(from, data, length)) < 0) { perror("reading from stream socket"); return rc; } else { return rc; } } string StreamSocket::remoteHost() { char *temp; string temp2; temp = inet_ntoa(remote.sin_addr); temp2 = temp; return temp2; }