예제 #1
0
파일: Socket.cpp 프로젝트: cbf621/tuxone
	bool Socket::IsAddrEqual(const char* addr1, const char* addr2)
	{
		assert(NULL != addr1);
		assert(NULL != addr2);

		std::string host1, host2;
		int min1, min2;
		int max1, max2;

		bool bRet = SplitAddr(addr1, host1, min1, max1);
		bRet = bRet && SplitAddr(addr2, host2, min2, max2);
		bRet = bRet && (min1 == min2);
		bRet = bRet && (((host1 == "0.0.0.0" || host1 == "127.0.0.1") && (host2 == "0.0.0.0" || host2 == "127.0.0.1")) ? true : host1 == host2);
		return bRet;
	}
예제 #2
0
파일: Socket.cpp 프로젝트: cbf621/tuxone
	LWPR::SOCKET_FD_T Socket::ConnectRemoteHost(const char* addr)
	{
		assert(NULL != addr);
		std::string host;
		int min_port = 0;
		int max_port = 0;

		if(SplitAddr(addr, host, min_port, max_port))
		{
			host = (host == "0.0.0.0") ? "127.0.0.1" : host;
			return ConnectRemoteHost(host.c_str(), min_port);
		}

		return -1;
	}
예제 #3
0
파일: Socket.cpp 프로젝트: cbf621/tuxone
	LWPR::SOCKET_RET_TYPE_E Socket::WriteUDPSocket(SOCKET_FD_T fd, const char* addr, const char* buf, int length)
	{
		assert(addr != NULL);
		assert(buf != NULL);

		int nDoneLen = 0, nRetNum = 0;
		SOCKET_RET_TYPE_E nRetResult = SOCKET_RET_FAILED;

		if(0 == length) return SOCKET_RET_OK;
		if(length < 0) return SOCKET_RET_FAILED;

		std::string host;
		int min_port = 0;
		int max_port = 0;
		if(SplitAddr(addr, host, min_port, max_port))
		{
			struct sockaddr_in addrt = {0};
			addrt.sin_family = AF_INET;
			addrt.sin_addr.s_addr = inet_addr(host.c_str());
			addrt.sin_port = htons(min_port);

			do
			{
				nRetResult = IsSocketWritable(fd, 0);
				if(nRetResult == SOCKET_RET_OK)
				{
					nRetNum = sendto(fd, buf + nDoneLen, length - nDoneLen,
					                 0, (struct sockaddr *)&addrt, sizeof(addrt));
					if(nRetNum == -1)
					{
						return ((errno == EINTR) ? SOCKET_RET_TIMEOUT : SOCKET_RET_FAILED);
					}
					else if(nRetNum == 0)
					{
						return SOCKET_RET_FAILED;
					}

					nDoneLen += nRetNum;
				}
			}
			while(nRetResult == SOCKET_RET_OK && (nDoneLen < length));
		}

		return nRetResult;
	}
예제 #4
0
파일: Socket.cpp 프로젝트: cbf621/tuxone
	bool Socket::AddrTransform(const char* addr_src, SOCKET_ADDR_T& addr_dest)
	{
		std::string host;
		int min_port, max_port;
		bool bResult = SplitAddr(addr_src, host, min_port, max_port);

		in_addr_t ip;
		uint16_t port;
		bResult = bResult && (INADDR_NONE != (ip = inet_addr(host.c_str())));

		if(bResult)
		{
			port = ntohs(min_port);
			addr_dest.ip = ip;
			addr_dest.port = port;
		}

		return bResult;
	}
예제 #5
0
파일: Socket.cpp 프로젝트: cbf621/tuxone
	LWPR::SOCKET_FD_T Socket::CreateServerTCPSocket(const char* addr)
	{
		assert(NULL != addr);
		std::string host;
		int min_port = 0;
		int max_port = 0;

		if(SplitAddr(addr, host, min_port, max_port))
		{
			for(int i = min_port; i <= max_port; i++)
			{
				LWPR::SOCKET_FD_T nFd = CreateServerTCPSocket(host.c_str(), i);
				if(nFd != -1)
				{
					return nFd;
				}
			}
		}

		return -1;
	}
예제 #6
0
void StreamLoginInfo(node* p, tchar_t* URL, bool_t Proxy)
{
    tchar_t LoginPass[MAXPATH];
    if (SplitAddr(URL,LoginPass,TSIZEOF(LoginPass),NULL,0))
    {
        // extract the login:pass from the URL as there seems to be one
        tchar_t *s,*t;
        if (!Proxy)
        {
            Node_SetData(p,STREAM_FULL_URL,TYPE_STRING,URL);

            t = (tchar_t*)GetProtocol(URL,NULL,0,NULL);
            s = tcschr(t,T('@'));
            assert(s!=NULL);
            ++s;
            memmove(t, s, tcsbytes(s));
        }

        t = (tchar_t*)GetProtocol(LoginPass,NULL,0,NULL);
        s=tcschr(t,T(':'));
        if (s)
            *s++ = 0;

        if (Proxy)
        {
            Node_SetData(p,STREAM_PROXY_PASSWORD,TYPE_STRING,s);
            Node_SetData(p,STREAM_PROXY_USERNAME,TYPE_STRING,t);
        }
        else
        {
            Node_SetData(p,STREAM_PASSWORD,TYPE_STRING,s);
            Node_SetData(p,STREAM_USERNAME,TYPE_STRING,t);
        }
    }
    else
        Node_RemoveData(p,STREAM_FULL_URL,TYPE_STRING);
}
예제 #7
0
void SplitURLLogin(const tchar_t *URL, tchar_t *UserName, size_t UserNameLen, tchar_t *Password, size_t PasswordLen, tchar_t *URL2, size_t URL2Len)
{
    tchar_t LoginPass[MAXPATH];
    if (SplitAddr(URL, LoginPass, TSIZEOF(LoginPass), NULL, 0))
    {
        tchar_t *s,*t;
        if (URL2) 
        {
            tcscpy_s(URL2, URL2Len, URL);
            t = (tchar_t*)GetProtocol(URL2,NULL,0,NULL);
            s = tcschr(t,T('@'));
            assert(s!=NULL);
            ++s;
            memmove(t, s, tcsbytes(s));
        }

        t = (tchar_t*)GetProtocol(LoginPass,NULL,0,NULL);
        s=tcschr(t,T(':'));
        if (s)
        {
            *s++ = 0;
// missing: resolving escape sequences
            if (Password)
                tcscpy_s(Password, PasswordLen, s);
        }  
        else
            tcsclr_s(Password, PasswordLen);
        if (UserName)
            tcscpy_s(UserName, UserNameLen, t);
    } else {
        tcsclr_s(UserName, UserNameLen);
        tcsclr_s(Password, PasswordLen);
        if (URL2)
            tcscpy_s(URL2, URL2Len, URL);
    }
}