-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsocket_stream.cc
65 lines (56 loc) · 1.23 KB
/
socket_stream.cc
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
#include "socket_stream.h"
namespace sylar {
SocketStream::SocketStream(Socket::ptr sock, bool owner)
:m_socket(sock)
,m_owner(owner) {
}
SocketStream::~SocketStream() {
if(m_owner && m_socket) {
m_socket->close();
}
}
int SocketStream::Streamread(void* buffer, size_t length) {
if(!isConnected()) {
return -1;
}
return m_socket->recv(buffer, length);
}
int SocketStream::Streamread(ByteArray::ptr ba, size_t length) {
if(!isConnected()) {
return -1;
}
std::vector<iovec> iovs;
ba->getWriteBuffers(iovs, length);
int rt = m_socket->recv(&iovs[0], iovs.size());
if(rt > 0) {
ba->setPostion(ba->getPosition() + rt);
}
return rt;
}
int SocketStream::Streamwrite(const void* buffer, size_t length) {
if(!isConnected()) {
return -1;
}
return m_socket->send(buffer, length);
}
int SocketStream::Streamwrite(ByteArray::ptr ba, size_t length) {
if(!isConnected()) {
return -1;
}
std::vector<iovec> iovs;
ba->getReadBuffers(iovs, length);
int rt = m_socket->send(&iovs[0], iovs.size());
if(rt > 0) {
ba->setPostion(ba->getPosition() + rt);
}
return rt;
}
bool SocketStream::isConnected() const {
return m_socket && m_socket->isConnected();
}
void SocketStream::close() {
if(m_socket) {
m_socket->close();
}
}
}