
The test worked by sleeping a certain time, then checking that the difference between recv timestamps before and after the sleep was within some margin of the requested sleep time. However, this means that imprecision of SleepMs makes the test flaky. This source of flakiness can be removed by comparing to the actual time slept instead of the requested time. Also making the margin larger, to further reduce the likelihood of flakiness. R=pthatcher@webrtc.org, stefan@webrtc.org Review URL: https://codereview.webrtc.org/2111043004 . Cr-Commit-Position: refs/heads/master@{#13733}
203 lines
5.8 KiB
C++
203 lines
5.8 KiB
C++
/*
|
|
* Copyright 2004 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_BASE_SOCKET_H__
|
|
#define WEBRTC_BASE_SOCKET_H__
|
|
|
|
#include <errno.h>
|
|
|
|
#if defined(WEBRTC_POSIX)
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <arpa/inet.h>
|
|
#include <netinet/in.h>
|
|
#define SOCKET_EACCES EACCES
|
|
#endif
|
|
|
|
#if defined(WEBRTC_WIN)
|
|
#include "webrtc/base/win32.h"
|
|
#endif
|
|
|
|
#include "webrtc/base/basictypes.h"
|
|
#include "webrtc/base/constructormagic.h"
|
|
#include "webrtc/base/socketaddress.h"
|
|
|
|
// Rather than converting errors into a private namespace,
|
|
// Reuse the POSIX socket api errors. Note this depends on
|
|
// Win32 compatibility.
|
|
|
|
#if defined(WEBRTC_WIN)
|
|
#undef EWOULDBLOCK // Remove errno.h's definition for each macro below.
|
|
#define EWOULDBLOCK WSAEWOULDBLOCK
|
|
#undef EINPROGRESS
|
|
#define EINPROGRESS WSAEINPROGRESS
|
|
#undef EALREADY
|
|
#define EALREADY WSAEALREADY
|
|
#undef ENOTSOCK
|
|
#define ENOTSOCK WSAENOTSOCK
|
|
#undef EDESTADDRREQ
|
|
#define EDESTADDRREQ WSAEDESTADDRREQ
|
|
#undef EMSGSIZE
|
|
#define EMSGSIZE WSAEMSGSIZE
|
|
#undef EPROTOTYPE
|
|
#define EPROTOTYPE WSAEPROTOTYPE
|
|
#undef ENOPROTOOPT
|
|
#define ENOPROTOOPT WSAENOPROTOOPT
|
|
#undef EPROTONOSUPPORT
|
|
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
|
|
#undef ESOCKTNOSUPPORT
|
|
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
|
|
#undef EOPNOTSUPP
|
|
#define EOPNOTSUPP WSAEOPNOTSUPP
|
|
#undef EPFNOSUPPORT
|
|
#define EPFNOSUPPORT WSAEPFNOSUPPORT
|
|
#undef EAFNOSUPPORT
|
|
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
|
#undef EADDRINUSE
|
|
#define EADDRINUSE WSAEADDRINUSE
|
|
#undef EADDRNOTAVAIL
|
|
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
|
|
#undef ENETDOWN
|
|
#define ENETDOWN WSAENETDOWN
|
|
#undef ENETUNREACH
|
|
#define ENETUNREACH WSAENETUNREACH
|
|
#undef ENETRESET
|
|
#define ENETRESET WSAENETRESET
|
|
#undef ECONNABORTED
|
|
#define ECONNABORTED WSAECONNABORTED
|
|
#undef ECONNRESET
|
|
#define ECONNRESET WSAECONNRESET
|
|
#undef ENOBUFS
|
|
#define ENOBUFS WSAENOBUFS
|
|
#undef EISCONN
|
|
#define EISCONN WSAEISCONN
|
|
#undef ENOTCONN
|
|
#define ENOTCONN WSAENOTCONN
|
|
#undef ESHUTDOWN
|
|
#define ESHUTDOWN WSAESHUTDOWN
|
|
#undef ETOOMANYREFS
|
|
#define ETOOMANYREFS WSAETOOMANYREFS
|
|
#undef ETIMEDOUT
|
|
#define ETIMEDOUT WSAETIMEDOUT
|
|
#undef ECONNREFUSED
|
|
#define ECONNREFUSED WSAECONNREFUSED
|
|
#undef ELOOP
|
|
#define ELOOP WSAELOOP
|
|
#undef ENAMETOOLONG
|
|
#define ENAMETOOLONG WSAENAMETOOLONG
|
|
#undef EHOSTDOWN
|
|
#define EHOSTDOWN WSAEHOSTDOWN
|
|
#undef EHOSTUNREACH
|
|
#define EHOSTUNREACH WSAEHOSTUNREACH
|
|
#undef ENOTEMPTY
|
|
#define ENOTEMPTY WSAENOTEMPTY
|
|
#undef EPROCLIM
|
|
#define EPROCLIM WSAEPROCLIM
|
|
#undef EUSERS
|
|
#define EUSERS WSAEUSERS
|
|
#undef EDQUOT
|
|
#define EDQUOT WSAEDQUOT
|
|
#undef ESTALE
|
|
#define ESTALE WSAESTALE
|
|
#undef EREMOTE
|
|
#define EREMOTE WSAEREMOTE
|
|
#undef EACCES
|
|
#define SOCKET_EACCES WSAEACCES
|
|
#endif // WEBRTC_WIN
|
|
|
|
#if defined(WEBRTC_POSIX)
|
|
#define INVALID_SOCKET (-1)
|
|
#define SOCKET_ERROR (-1)
|
|
#define closesocket(s) close(s)
|
|
#endif // WEBRTC_POSIX
|
|
|
|
namespace rtc {
|
|
|
|
inline bool IsBlockingError(int e) {
|
|
return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
|
|
}
|
|
|
|
struct SentPacket {
|
|
SentPacket() : packet_id(-1), send_time_ms(-1) {}
|
|
SentPacket(int packet_id, int64_t send_time_ms)
|
|
: packet_id(packet_id), send_time_ms(send_time_ms) {}
|
|
|
|
int packet_id;
|
|
int64_t send_time_ms;
|
|
};
|
|
|
|
// General interface for the socket implementations of various networks. The
|
|
// methods match those of normal UNIX sockets very closely.
|
|
class Socket {
|
|
public:
|
|
virtual ~Socket() {}
|
|
|
|
// Returns the address to which the socket is bound. If the socket is not
|
|
// bound, then the any-address is returned.
|
|
virtual SocketAddress GetLocalAddress() const = 0;
|
|
|
|
// Returns the address to which the socket is connected. If the socket is
|
|
// not connected, then the any-address is returned.
|
|
virtual SocketAddress GetRemoteAddress() const = 0;
|
|
|
|
virtual int Bind(const SocketAddress& addr) = 0;
|
|
virtual int Connect(const SocketAddress& addr) = 0;
|
|
virtual int Send(const void *pv, size_t cb) = 0;
|
|
virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
|
|
// |timestamp| is in units of microseconds.
|
|
virtual int Recv(void* pv, size_t cb, int64_t* timestamp) = 0;
|
|
virtual int RecvFrom(void* pv,
|
|
size_t cb,
|
|
SocketAddress* paddr,
|
|
int64_t* timestamp) = 0;
|
|
virtual int Listen(int backlog) = 0;
|
|
virtual Socket *Accept(SocketAddress *paddr) = 0;
|
|
virtual int Close() = 0;
|
|
virtual int GetError() const = 0;
|
|
virtual void SetError(int error) = 0;
|
|
inline bool IsBlocking() const { return IsBlockingError(GetError()); }
|
|
|
|
enum ConnState {
|
|
CS_CLOSED,
|
|
CS_CONNECTING,
|
|
CS_CONNECTED
|
|
};
|
|
virtual ConnState GetState() const = 0;
|
|
|
|
// Fills in the given uint16_t with the current estimate of the MTU along the
|
|
// path to the address to which this socket is connected. NOTE: This method
|
|
// can block for up to 10 seconds on Windows.
|
|
virtual int EstimateMTU(uint16_t* mtu) = 0;
|
|
|
|
enum Option {
|
|
OPT_DONTFRAGMENT,
|
|
OPT_RCVBUF, // receive buffer size
|
|
OPT_SNDBUF, // send buffer size
|
|
OPT_NODELAY, // whether Nagle algorithm is enabled
|
|
OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
|
|
OPT_DSCP, // DSCP code
|
|
OPT_RTP_SENDTIME_EXTN_ID, // This is a non-traditional socket option param.
|
|
// This is specific to libjingle and will be used
|
|
// if SendTime option is needed at socket level.
|
|
};
|
|
virtual int GetOption(Option opt, int* value) = 0;
|
|
virtual int SetOption(Option opt, int value) = 0;
|
|
|
|
protected:
|
|
Socket() {}
|
|
|
|
private:
|
|
RTC_DISALLOW_COPY_AND_ASSIGN(Socket);
|
|
};
|
|
|
|
} // namespace rtc
|
|
|
|
#endif // WEBRTC_BASE_SOCKET_H__
|