147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_ASYNCUDPSOCKET_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_ASYNCUDPSOCKET_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncpacketsocket.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketfactory.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Provides the ability to receive packets asynchronously. Sends are not 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// buffered since it is acceptable to drop packets under high load. 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AsyncUDPSocket : public AsyncPacketSocket { 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Binds |socket| and creates AsyncUDPSocket for it. Takes ownership 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // of |socket|. Returns NULL if bind() fails (|socket| is destroyed 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // in that case). 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static AsyncUDPSocket* Create(AsyncSocket* socket, 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddress& bind_address); 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Creates a new socket for sending asynchronous UDP packets using an 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // asynchronous socket from the given factory. 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static AsyncUDPSocket* Create(SocketFactory* factory, 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const SocketAddress& bind_address); 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AsyncUDPSocket(AsyncSocket* socket); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~AsyncUDPSocket(); 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetLocalAddress() const; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetRemoteAddress() const; 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Send(const void *pv, size_t cb, 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const rtc::PacketOptions& options); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr, 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org const rtc::PacketOptions& options); 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Close(); 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual State GetState() const; 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int GetOption(Socket::Option opt, int* value); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int SetOption(Socket::Option opt, int value); 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int GetError() const; 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SetError(int error); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Called when the underlying socket is ready to be read from. 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnReadEvent(AsyncSocket* socket); 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Called when the underlying socket is ready to send. 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnWriteEvent(AsyncSocket* socket); 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<AsyncSocket> socket_; 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org char* buf_; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org size_t size_; 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_ASYNCUDPSOCKET_H_ 64