Ejemplo n.º 1
0
void AbstractHost::disconnect()
{
	state = Disconnecting;

	if(sendBuffer.size() == 0)
	{
		shutdownSocket();
	}
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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();
	}
}
Ejemplo n.º 4
0
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;
}