void AbstractHost::disconnect() { state = Disconnecting; if(sendBuffer.size() == 0) { shutdownSocket(); } }
void UDP_Socket::shutdown() { shutdownSocket(); free(messageBuffer); free(byteTokResult); free(packetData); delete[] headerBuffer; delete[] ackBuffer; for (unsigned int i = 0; i < UDP_PACKET_BUFFER_SIZE; i++) { delete receivedPacketsBuffer[i]; } delete mSendingPacket; }
void AbstractHost::writeCallback(ev::io &watcher, int revents) { int bytesWritten = -1; char errorBuffer[128] = {'\0'}; std::string buffer; int bufferSize = 0; int sendBufferSize = sendBuffer.size(); while(sendBufferSize > 0) { if(sendBufferSize > 4096) { buffer = sendBuffer.substr(0,4096); bufferSize = 4096; } else { buffer = sendBuffer; bufferSize = sendBufferSize; } bytesWritten = send(hostSocket, buffer.c_str(), bufferSize, 0); if(bytesWritten < 0 && !(errno == EAGAIN || errno == EWOULDBLOCK) ) { // errorBuffer = strerror_r(errno, errorBuffer, 128); // throw std::runtime_error("Host socket send failed: "+std::string(errorBuffer)); throw std::runtime_error("Host socket send failed: "+std::string(strerror_r(errno,errorBuffer,128))); } else if(errno == EAGAIN || errno == EWOULDBLOCK) { break; } sendBuffer.erase(0,bytesWritten); sendBufferSize -= bytesWritten; } if(state == Disconnecting && sendBuffer.size() == 0) { shutdownSocket(); } else if (sendBuffer.size() == 0) { writeWatcher->stop(); } }
bool Socket_TCP::connectTo(const char * hostname, uint16_t port, uint32_t timeout) { char servport[32]; int rc; struct in6_addr serveraddr; struct addrinfo hints, *res=NULL; memset(&hints, 0x00, sizeof(hints)); #ifdef _WIN32 hints.ai_flags = 0; #else hints.ai_flags = AI_NUMERICSERV; #endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; rc = inet_pton(AF_INET, hostname, &serveraddr); if (rc == 1) { hints.ai_family = AF_INET; hints.ai_flags |= AI_NUMERICHOST; } else { rc = inet_pton(AF_INET6, hostname, &serveraddr); if (rc == 1) { hints.ai_family = AF_INET6; hints.ai_flags |= AI_NUMERICHOST; } } snprintf(servport,32,"%u",port); rc = getaddrinfo(hostname, servport, &hints, &res); if (rc != 0) { // Host not found. lastError = "Error resolving hostname"; return false; } bool connected = false; for (struct addrinfo *resiter=res; resiter && !connected; resiter = resiter->ai_next) { if (getSocket() >=0 ) closeSocket(); setSocket(socket(res->ai_family, res->ai_socktype, res->ai_protocol)); if (!isValidSocket()) { lastError = "socket() failed"; break; } // Set the read timeout here. (to zero) setReadTimeout(0); if (internalConnect(getSocket(),resiter->ai_addr, resiter->ai_addrlen,timeout)) { // now it's connected... if (PostConnectSubInitialization()) { connected = true; } else { // should disconnect here. shutdownSocket(); // drop the socket descriptor. we don't need it anymore. closeSocket(); } break; } else { // drop the current socket... (and free the resource :)) shutdownSocket(); closeSocket(); } } freeaddrinfo(res); if (!connected) { lastError = "connect() failed"; return false; } return true; }