00001 // -*- c++ -*- 00002 //------------------------------------------------------------------------------ 00003 // UnConUDPSocket.C 00004 //------------------------------------------------------------------------------ 00005 // Copyright (c) 1999 by Vladislav Grinchenko 00006 // 00007 // This library is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU Library General Public 00009 // License as published by the Free Software Foundation; either 00010 // version 2 of the License, or (at your option) any later version. 00011 //------------------------------------------------------------------------------ 00012 // Created: 03/23/99 00013 //------------------------------------------------------------------------------ 00014 00015 #include "assa/UnConUDPSocket.h" 00016 00017 using namespace ASSA; 00018 00019 int 00020 UnConUDPSocket:: 00021 recvfrom (char* buf_, int size_, Address* peer_addr_) 00022 { 00023 // ::recvfrom() can return 0 bytes which is not 00024 // considered an eof. Peer can advertise its address to 00025 // the server by sending 0 bytes length message. 00026 // 00027 00028 // char self[] = "Socket::recvfro"; trace(self); 00029 00030 // Setting saddr_len is crucial to proper ::recvfrom() operation. 00031 // If left improprely initialized, ::recvfrom() won't fill in peer's 00032 // address and won't report an error either. If SA ptr is passed to 00033 // recvfrom() along with uninitialized address len (or set to 0), 00034 // recvfrom() returns zeroed out address structure!!! 00035 00036 int len; 00037 socklen_t pa_len = peer_addr_->getLength(); 00038 00039 SA* pa = peer_addr_->getAddress(); 00040 00041 #ifdef __CYGWIN32__ 00042 len = ::recvfrom(getHandler(), buf_, size_, 0, pa, (int*)&pa_len); 00043 #else 00044 len = ::recvfrom(getHandler(), buf_, size_, 0, pa, &pa_len); 00045 #endif 00046 00047 // Q: for UNIX domain socket, returned length will be essential to 00048 // remember and probably should be set in peer_addr_ by calling 00049 // setLength()..... 00050 00051 return len; 00052 } 00053 00054 int 00055 UnConUDPSocket:: 00056 sendto (const char* buf_, const unsigned int size_, const Address* peer_addr_) 00057 { 00058 return ::sendto (getHandler(), buf_, size_, 0, 00059 peer_addr_->getAddress(), 00060 peer_addr_->getLength()); 00061 } 00062 00063