/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * tcp_socket.cc * * Fri Aug 18 00:12:34 CEST 2006 * Copyright 2006 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MIaV is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "tcp_socket.h" #include // for connect, listen, bind and accept #include #include // For socket #include #include // For TCP #include #include #include // For inet_ntoa #include #include #include TCPSocket::TCPSocket(int port, std::string addr) : Socket(port, addr) { sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); } static int _listen(int sockfd, int backlog){return listen(sockfd, backlog);} int TCPSocket::listen(TCPSocket *s) { if(!s) { strerr = "TCPSocket is a NULL pointer."; return 1; } if(s->connected) { strerr = "TCPSocket already connected."; return 1; } if(!connected) { struct sockaddr_in socketaddr; memset((char *) &socketaddr, sizeof(socketaddr), 0); socketaddr.sin_family = AF_INET; socketaddr.sin_port = htons(prt); socketaddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr*)&socketaddr, sizeof(socketaddr)) == -1) { strerr = "Socket: bind() failed! "; strerr.append(strerror(errno)); return 1; } if(_listen(sock, 5) == -1) { strerr = "Socket: listen() failed! "; strerr.append(strerror(errno)); return 1; } connected = true; } // accept new connection and get its connection descriptor struct sockaddr_in ssocketaddr; int csalen = sizeof(ssocketaddr); s->sock = accept(sock, (struct sockaddr*)&ssocketaddr, (socklen_t*)&csalen); if (s->sock < 0) { s->connected = false; strerr = "Socket: accept() failed! "; strerr.append(strerror(errno)); return 1; } // Fill in the host data. s->setAddress(inet_ntoa(ssocketaddr.sin_addr)); s->setPort(ssocketaddr.sin_port); s->connected = true; return 0; }