MCPcopy Create free account
hub / github.com/caozhiyi/CppNet / Send

Method Send

net/linux/SocketImpl.cpp:192–242  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

190}
191
192void CSocketImpl::Send(base::CMemSharePtr<CEventHandler>& event) {
193 if (!event->_client_socket) {
194 base::LOG_WARN("the event with out socket");
195 return;
196 }
197 auto socket_ptr = event->_client_socket.Lock();
198 if (!socket_ptr) {
199 base::LOG_WARN("the event'socket is destroyed");
200 return;
201 }
202
203 int err = event->_event_flag_set;
204 if (event->_event_flag_set & EVENT_TIMER) {
205 err |= ERR_TIME_OUT;
206 event->_event_flag_set &= ~EVENT_TIMER;
207
208 } else {
209 event->_off_set = 0;
210 while(event->_buffer && event->_buffer->GetCanReadLength() > 0) {
211 std::vector<base::iovec> io_vec;
212 int data_len = event->_buffer->GetUseMemoryBlock(io_vec, __linux_write_buff_get);
213 int res = writev(socket_ptr->GetSocket(), (iovec*)&*io_vec.begin(), io_vec.size());
214 if (res >= 0) {
215 event->_buffer->Clear(res);
216 event->_off_set += res;
217
218 } else {
219 if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) {
220 //can't send complete
221 if (res < data_len) {
222 _event_actions->AddSendEvent(_write_event);
223 }
224
225 } else if (errno == EBADMSG) {
226 err |= ERR_CONNECT_BREAK;
227 base::LOG_ERROR("send filed! %d", errno);
228 break;
229
230 } else {
231 err |= ERR_CONNECT_CLOSE;
232 base::LOG_ERROR("send filed! %d", errno);
233 break;
234 }
235 }
236 }
237 auto cppnet_ins = GetCppnetInstance();
238 if (cppnet_ins) {
239 cppnet_ins->_WriteFunction(event, err);
240 }
241 }
242}
243#endif

Callers 2

_DoTimeoutEventMethod · 0.45
_DoEventMethod · 0.45

Calls 7

LockMethod · 0.80
_WriteFunctionMethod · 0.80
GetCanReadLengthMethod · 0.45
GetUseMemoryBlockMethod · 0.45
GetSocketMethod · 0.45
ClearMethod · 0.45
AddSendEventMethod · 0.45

Tested by

no test coverage detected