UnConUDPSocket.cpp

Go to the documentation of this file.
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 

Generated on Mon Dec 19 16:37:15 2005 for libassa by  doxygen 1.4.5