/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * udp_socket.cc * * Fri Aug 18 00:12:25 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 "udp_socket.h" #include // For socket #include #include // For UDP #include #include // For inet_ntoa #include #include #include #include "info.h" UDPSocket::UDPSocket(int port, std::string addr) : Socket(port, addr) { sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sock == -1) MIaV::info->error("Could not create UDP socket: %s", strerror(errno)); } int UDPSocket::write(void *buf, int size) { int n; if(!connected) { memset((char *) &sa, sizeof(sa), 0); sa.sin_family = AF_INET; sa.sin_port = htons(prt); if (inet_aton(addr.c_str(), &sa.sin_addr)==0) { MIaV::info->error("An error occurred in inet_aton! %s", strerror(errno)); } connected = true; } n = sendto(sock, buf, size, 0, (const sockaddr*)&sa, (socklen_t)sizeof(sa)); if(n==-1) { MIaV::info->error("An error occurred! %s", strerror(errno)); } return n; } int UDPSocket::read(void *buf, int size) { int n; if(!connected) { struct sockaddr_in si_me; si_me.sin_family = AF_INET; si_me.sin_port = htons(prt); si_me.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sock, (const sockaddr*)&si_me, (socklen_t)sizeof(si_me))==-1) { strerr = "UDPSocet failed on bind. "; strerr.append(strerror(errno)); return -1; } connected = true; } int slen = sizeof(sa); n = recvfrom(sock, buf, size, 0, (sockaddr*)&sa, (socklen_t*)&slen); if(n == -1) { strerr = "UDPSocet failed on read. "; strerr.append(strerror(errno)); return -1; } // Fill in the host data. setAddress(inet_ntoa(sa.sin_addr)); setPort(sa.sin_port); return n; }