socket.h revision 572bce29088521caf7f90c9fa66a8237a7674435
1815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell/*
2815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * Copyright (C) 2015 The Android Open Source Project
3815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * All rights reserved.
4815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *
5815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * Redistribution and use in source and binary forms, with or without
6815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * modification, are permitted provided that the following conditions
7815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * are met:
8815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *  * Redistributions of source code must retain the above copyright
9815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *    notice, this list of conditions and the following disclaimer.
10815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *  * Redistributions in binary form must reproduce the above copyright
11815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *    notice, this list of conditions and the following disclaimer in
12815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *    the documentation and/or other materials provided with the
13815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *    distribution.
14815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell *
15815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell * SUCH DAMAGE.
27815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell */
28815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
29572bce29088521caf7f90c9fa66a8237a7674435David Pursell// This file provides a class interface for cross-platform socket functionality. The main fastboot
30815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell// engine should not be using this interface directly, but instead should use a higher-level
31572bce29088521caf7f90c9fa66a8237a7674435David Pursell// interface that enforces the fastboot protocol.
32815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
33815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell#ifndef SOCKET_H_
34815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell#define SOCKET_H_
35815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
36815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell#include <memory>
37815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell#include <string>
38815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
39572bce29088521caf7f90c9fa66a8237a7674435David Pursell#include <android-base/macros.h>
40572bce29088521caf7f90c9fa66a8237a7674435David Pursell#include <cutils/sockets.h>
41572bce29088521caf7f90c9fa66a8237a7674435David Pursell
42572bce29088521caf7f90c9fa66a8237a7674435David Pursell// Socket interface to be implemented for each platform.
43572bce29088521caf7f90c9fa66a8237a7674435David Pursellclass Socket {
44815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell  public:
45572bce29088521caf7f90c9fa66a8237a7674435David Pursell    enum class Protocol { kTcp, kUdp };
46572bce29088521caf7f90c9fa66a8237a7674435David Pursell
47815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // Creates a new client connection. Clients are connected to a specific hostname/port and can
48815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // only send to that destination.
49815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // On failure, |error| is filled (if non-null) and nullptr is returned.
50572bce29088521caf7f90c9fa66a8237a7674435David Pursell    static std::unique_ptr<Socket> NewClient(Protocol protocol, const std::string& hostname,
51572bce29088521caf7f90c9fa66a8237a7674435David Pursell                                             int port, std::string* error);
52815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
53815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // Creates a new server bound to local |port|. This is only meant for testing, during normal
54815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // fastboot operation the device acts as the server.
55572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // A UDP server saves sender addresses in Receive(), and uses the most recent address during
56815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // calls to Send().
57572bce29088521caf7f90c9fa66a8237a7674435David Pursell    static std::unique_ptr<Socket> NewServer(Protocol protocol, int port);
58815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
59572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // Destructor closes the socket if it's open.
60572bce29088521caf7f90c9fa66a8237a7674435David Pursell    virtual ~Socket();
61815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
62572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // Sends |length| bytes of |data|. For TCP sockets this will continue trying to send until all
63572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // bytes are transmitted. Returns the number of bytes actually sent or -1 on error.
64815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    virtual ssize_t Send(const void* data, size_t length) = 0;
65815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
66815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // Waits up to |timeout_ms| to receive up to |length| bytes of data. |timout_ms| of 0 will
67815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // block forever. Returns the number of bytes received or -1 on error/timeout. On timeout
68815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // errno will be set to EAGAIN or EWOULDBLOCK.
69815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    virtual ssize_t Receive(void* data, size_t length, int timeout_ms) = 0;
70815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
71572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // Calls Receive() until exactly |length| bytes have been received or an error occurs.
72572bce29088521caf7f90c9fa66a8237a7674435David Pursell    virtual ssize_t ReceiveAll(void* data, size_t length, int timeout_ms);
73572bce29088521caf7f90c9fa66a8237a7674435David Pursell
74815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // Closes the socket. Returns 0 on success, -1 on error.
75572bce29088521caf7f90c9fa66a8237a7674435David Pursell    virtual int Close();
76572bce29088521caf7f90c9fa66a8237a7674435David Pursell
77572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // Accepts an incoming TCP connection. No effect for UDP sockets. Returns a new Socket
78572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // connected to the client on success, nullptr on failure.
79572bce29088521caf7f90c9fa66a8237a7674435David Pursell    virtual std::unique_ptr<Socket> Accept() { return nullptr; }
80815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
81815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell  protected:
82815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell    // Protected constructor to force factory function use.
83572bce29088521caf7f90c9fa66a8237a7674435David Pursell    Socket(cutils_socket_t sock);
84572bce29088521caf7f90c9fa66a8237a7674435David Pursell
85572bce29088521caf7f90c9fa66a8237a7674435David Pursell    // Update the socket receive timeout if necessary.
86572bce29088521caf7f90c9fa66a8237a7674435David Pursell    bool SetReceiveTimeout(int timeout_ms);
87572bce29088521caf7f90c9fa66a8237a7674435David Pursell
88572bce29088521caf7f90c9fa66a8237a7674435David Pursell    cutils_socket_t sock_ = INVALID_SOCKET;
89572bce29088521caf7f90c9fa66a8237a7674435David Pursell
90572bce29088521caf7f90c9fa66a8237a7674435David Pursell  private:
91572bce29088521caf7f90c9fa66a8237a7674435David Pursell    int receive_timeout_ms_ = 0;
92815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
93572bce29088521caf7f90c9fa66a8237a7674435David Pursell    DISALLOW_COPY_AND_ASSIGN(Socket);
94815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell};
95815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell
96815c7beae73bc0d13f14a94972175756aec1d4deDavid Pursell#endif  // SOCKET_H_
97