bool Socket::send(const Str & data) { if(file < 0) throw InvalidState("Socket is closed."); writeBuffer.append(data); return writeFromBuffer(); }
static BOOL writeResponse(HANDLE sd, PFSCloudAnswer response) { return writeFromBuffer((SOCKET)sd, response, sizeof(FSCloudAnswer)); }
int ServerSocket::processEventThread() { epoll_event ev; ev.events = EPOLLIN | EPOLLOUT | EPOLLET | EPOLLRDHUP; epoll_event events[EPOLL_SIZE]; sockaddr clientAddr; socklen_t addrlen = sizeof(sockaddr); while (true) { int eventCount = epoll_wait(epfd, events, EPOLL_SIZE, -1); if (eventCount == -1) { if (errno == EINTR) { continue; } Log::e("epoll wait error=%s", strerror(errno)); return -1; } for (int i = 0; i < eventCount; ++i) { epoll_event& evt(events[i]); if (evt.events & EPOLLERR || evt.events & EPOLLHUP) { // handle errors } if (evt.events & EPOLLIN) { if (evt.data.fd == listenSocket) { while (true) { Socket acceptedSocket = accept4(listenSocket, &clientAddr, &addrlen, SOCK_NONBLOCK); if (acceptedSocket == -1) { if (errno != EAGAIN && errno != EWOULDBLOCK) { Log::e("accept error: %s", strerror(errno)); } break; } if (numClients < config.maxConnection) { ev.data.ptr = addClient(acceptedSocket, (sockaddr_in&)clientAddr); epoll_ctl(epfd, EPOLL_CTL_ADD, acceptedSocket, &ev); } else { close(acceptedSocket); } } } else { ClientSocket* client = (ClientSocket*)evt.data.ptr; readIntoBuffer(client); } } if (evt.events & EPOLLOUT) { ClientSocket* client = (ClientSocket*)evt.data.ptr; writeFromBuffer(client); } if (evt.events & EPOLLRDHUP) { ClientSocket* client = (ClientSocket*)evt.data.ptr; client->isClosing = true; } } } return 0; } //end of processEvent
// main thread void ServerSocket::flushClient(ClientSocket* client) { writeFromBuffer(client); }
// auxiliary function to send client request BOOL WriteRequest(SOCKET sd, PFSCloudRequestHeader request) { return writeFromBuffer(sd, request, sizeof(FSCloudRequestHeader)); }