-
Notifications
You must be signed in to change notification settings - Fork 144
/
Copy pathClientSocket.h
165 lines (126 loc) · 5.52 KB
/
ClientSocket.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
*
* @APPLE_LICENSE_HEADER_START@
*
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_LICENSE_HEADER_END@
*
*/
/*
File: ClientSocket.h
*/
#ifndef __CLIENT_SOCKET__
#define __CLIENT_SOCKET__
#include "OSHeaders.h"
#include "TCPSocket.h"
class ClientSocket
{
public:
ClientSocket();
virtual ~ClientSocket() {}
void Set(UInt32 hostAddr, UInt16 hostPort)
{ fHostAddr = hostAddr; fHostPort = hostPort; }
//
// Sends data to the server. If this returns EAGAIN or EINPROGRESS, call again
// until it returns OS_NoErr or another error. On subsequent calls, you need not
// provide a buffer.
//
// When this call returns EAGAIN or EINPROGRESS, caller should use GetEventMask
// and GetSocket to wait for a socket event.
OS_Error Send(char* inData, const UInt32 inLength);
//
// Sends an ioVec to the server. Same conditions apply as above function
virtual OS_Error SendV(iovec* inVec, UInt32 inNumVecs) = 0;
//
// Reads data from the server. If this returns EAGAIN or EINPROGRESS, call
// again until it returns OS_NoErr or another error. This call may return OS_NoErr
// and 0 for rcvLen, in which case you should call it again.
//
// When this call returns EAGAIN or EINPROGRESS, caller should use GetEventMask
// and GetSocket to wait for a socket event.
virtual OS_Error Read(void* inBuffer, const UInt32 inLength, UInt32* outRcvLen) = 0;
//
// ACCESSORS
UInt32 GetHostAddr() { return fHostAddr; }
virtual UInt32 GetLocalAddr() = 0;
// If one of the above methods returns EWOULDBLOCK or EINPROGRESS, you
// can check this to see what events you should wait for on the socket
UInt32 GetEventMask() { return fEventMask; }
Socket* GetSocket() { return fSocketP; }
virtual void SetRcvSockBufSize(UInt32 inSize) = 0;
protected:
// Generic connect function
OS_Error Connect(TCPSocket* inSocket);
// Generic open function
OS_Error Open(TCPSocket* inSocket);
OS_Error SendSendBuffer(TCPSocket* inSocket);
UInt32 fHostAddr;
UInt16 fHostPort;
UInt32 fEventMask;
Socket* fSocketP;
enum
{
kSendBufferLen = 2048
};
// Buffer for sends.
char fSendBuf[kSendBufferLen + 1];
StrPtrLen fSendBuffer;
UInt32 fSentLength;
};
class TCPClientSocket : public ClientSocket
{
public:
TCPClientSocket(UInt32 inSocketType);
virtual ~TCPClientSocket() {}
//
// Implements the ClientSocket Send and Receive interface for a TCP connection
virtual OS_Error SendV(iovec* inVec, UInt32 inNumVecs);
virtual OS_Error Read(void* inBuffer, const UInt32 inLength, UInt32* outRcvLen);
virtual UInt32 GetLocalAddr() { return fSocket.GetLocalAddr(); }
virtual void SetRcvSockBufSize(UInt32 inSize) { fSocket.SetSocketRcvBufSize(inSize); }
virtual void SetOptions(int sndBufSize = 8192,int rcvBufSize=1024);
virtual UInt16 GetLocalPort() { return fSocket.GetLocalPort(); }
private:
TCPSocket fSocket;
};
class HTTPClientSocket : public ClientSocket
{
public:
HTTPClientSocket(const StrPtrLen& inURL, UInt32 inCookie, UInt32 inSocketType);
virtual ~HTTPClientSocket();
//
// Closes the POST half of the RTSP / HTTP connection
void ClosePost() { delete fPostSocket; fPostSocket = NULL; }
//
// Implements the ClientSocket Send and Receive interface for an RTSP / HTTP connection
virtual OS_Error SendV(iovec* inVec, UInt32 inNumVecs);
// Both SendV and Read use the fSendBuffer; so you cannot have both operations be running at the same time.
virtual OS_Error Read(void* inBuffer, const UInt32 inLength, UInt32* outRcvLen);
virtual UInt32 GetLocalAddr() { return fGetSocket.GetLocalAddr(); }
virtual void SetRcvSockBufSize(UInt32 inSize) { fGetSocket.SetSocketRcvBufSize(inSize); }
private:
void EncodeVec(iovec* inVec, UInt32 inNumVecs);
StrPtrLen fURL;
UInt32 fCookie;
UInt32 fSocketType;
UInt32 fGetReceived;
TCPSocket fGetSocket;
TCPSocket* fPostSocket;
};
#endif //__CLIENT_SOCKET__