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; }
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; }
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; }
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; }
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; }
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); }
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); } }