Home | History | Annotate | Download | only in remote-processor
      1 /*
      2  * Copyright (c) 2011-2015, Intel Corporation
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without modification,
      6  * are permitted provided that the following conditions are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright notice, this
      9  * list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above copyright notice,
     12  * this list of conditions and the following disclaimer in the documentation and/or
     13  * other materials provided with the distribution.
     14  *
     15  * 3. Neither the name of the copyright holder nor the names of its contributors
     16  * may be used to endorse or promote products derived from this software without
     17  * specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
     23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 #include "ListeningSocket.h"
     31 #include <sys/types.h>
     32 #include <sys/socket.h>
     33 #include <netinet/in.h>
     34 #include <unistd.h>
     35 #include <assert.h>
     36 #include <netdb.h>
     37 #include <strings.h>
     38 #include <sstream>
     39 
     40 #include <stdio.h>
     41 #include <errno.h>
     42 #include <cstring>
     43 
     44 #define base CSocket
     45 
     46 using std::string;
     47 
     48 CListeningSocket::CListeningSocket()
     49 {
     50     int iOption = true;
     51     // Reuse option
     52     setsockopt(getFd(), SOL_SOCKET, SO_REUSEADDR, &iOption, sizeof(iOption));
     53 }
     54 
     55 // Listen
     56 bool CListeningSocket::listen(uint16_t uiPort, string &strError)
     57 {
     58     struct sockaddr_in server_addr;
     59 
     60     // Fill server address
     61     initSockAddrIn(&server_addr, INADDR_ANY, uiPort);
     62 
     63     // Bind
     64     if (bind(getFd(), (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1) {
     65 
     66         std::ostringstream oss;
     67         oss << uiPort;
     68         strError = "Could not bind socket to port " + oss.str() + ": " + strerror(errno);
     69         return false;
     70     }
     71 
     72     if (::listen(getFd(), 5) == -1) {
     73 
     74         std::ostringstream oss;
     75         oss << uiPort;
     76         strError = "Could not listen to port " + oss.str() + ": " + strerror(errno);
     77         return false;
     78     }
     79     return true;
     80 }
     81 
     82 // Accept
     83 CSocket* CListeningSocket::accept()
     84 {
     85     struct sockaddr_in client_addr;
     86     socklen_t ulClientAddrLen = sizeof(client_addr);
     87 
     88     int iSockId = ::accept(getFd(), (struct sockaddr*)&client_addr, &ulClientAddrLen);
     89 
     90     if (iSockId == -1) {
     91 
     92         perror("CListeningSocket::accept::accept");
     93 
     94         return NULL;
     95     }
     96     return new CSocket(iSockId);
     97 }
     98