bool Socket_Base::Base_Connect(const wchar_t* host,const wchar_t* serv){ ADDRINFOW hints; ADDRINFOW *addrinfo; wchar_t* port[17];//SHORTの最大値16bit+終端文字1bit; wchar_t* proto=TEXT("tcp"); Base_Reset(); memset(&hints,0,sizeof(hints));//必ず初期化する hints.ai_family=AF_INET;//AF_UNSPECでIPV6対応(めんどいのでしません。ただのメモです) hints.ai_socktype=SOCK_STREAM; hints.ai_protocol=IPPROTO_TCP; GetAddrInfo(host,serv,&hints,&addrinfo); m_sock=socket(addrinfo->ai_family,addrinfo->ai_socktype,addrinfo->ai_protocol); if(m_sock==INVALID_SOCKET){ goto EXIT; } if(connect(m_sock,addrinfo->ai_addr,addrinfo->ai_addrlen)==SOCKET_ERROR){ goto EXIT; } m_host=host; FreeAddrInfo(addrinfo); return true; EXIT://エラーの場合 FreeAddrInfo(addrinfo); MessageBox(NULL,TEXT("ソケットの作成または接続に失敗しました"),NULL,MB_OK); exit(0); return false; }
// Set up a connection to a ScrollView on hostname:port. SVNetwork::SVNetwork(const char* hostname, int port) { mutex_send_ = new SVMutex(); msg_buffer_in_ = new char[kMaxMsgSize + 1]; msg_buffer_in_[0] = '\0'; has_content = false; buffer_ptr_ = NULL; struct addrinfo *addr_info = NULL; if (GetAddrInfo(hostname, port, &addr_info) != 0) { std::cerr << "Error resolving name for ScrollView host " << std::string(hostname) << ":" << port << std::endl; } stream_ = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); // If server is not there, we will start a new server as local child process. if (connect(stream_, addr_info->ai_addr, addr_info->ai_addrlen) < 0) { const char* scrollview_path = getenv("SCROLLVIEW_PATH"); if (scrollview_path == NULL) { #ifdef SCROLLVIEW_PATH #define _STR(a) #a #define _XSTR(a) _STR(a) scrollview_path = _XSTR(SCROLLVIEW_PATH); #undef _XSTR #undef _STR #else scrollview_path = "."; #endif } const char *prog = ScrollViewProg(); std::string command = ScrollViewCommand(scrollview_path); SVSync::StartProcess(prog, command.c_str()); // Wait for server to show up. // Note: There is no exception handling in case the server never turns up. stream_ = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); while (connect(stream_, addr_info->ai_addr, addr_info->ai_addrlen) < 0) { std::cout << "ScrollView: Waiting for server...\n"; #ifdef _WIN32 Sleep(1000); #else sleep(1); #endif stream_ = socket(addr_info->ai_family, addr_info->ai_socktype, addr_info->ai_protocol); } } FreeAddrInfo(addr_info); }
bool fini_state(program_state_t * state) { if (state->addrinfo == NULL) { FreeAddrInfo(state->addrinfo); } if (state->exit_evt != NULL) { CloseHandle(state->exit_evt); } if (state->tpool != (TPHANDLE)-1) { StopThreadPool(state->tpool, 2 * 60 * 1000); } return true; }
void CCustomIOCPBaseList::GetLocalAddrs(vector<tstring> &Addrs) { LPSTR sHostName; ADDRINFOT _Hints; int _Retval; PADDRINFOT _ResultAddInfo; PADDRINFOT _NextAddInfo; Addrs.clear(); sHostName = new char[MAX_PATH]; if (gethostname(sHostName, MAX_PATH) == SOCKET_ERROR) { return; } ZeroMemory(&_Hints, sizeof(_Hints)); _Hints.ai_family = AF_UNSPEC; _Hints.ai_socktype = SOCK_STREAM; _Hints.ai_protocol = IPPROTO_TCP; std::tstring hostname = string_to_tstring(std::string(sHostName)); _Retval = GetAddrInfo(hostname.c_str(), NULL, &_Hints, &_ResultAddInfo); if (_Retval == 0) { DWORD _AddrStringLen; LPTSTR _AddrString; _NextAddInfo = _ResultAddInfo; // 申请缓冲区 _AddrString = new TCHAR[ADDR_STRING_MAX_LEN]; while (_NextAddInfo != NULL) { _AddrStringLen = ADDR_STRING_MAX_LEN; // 获取 if (WSAAddressToString(_NextAddInfo->ai_addr, (DWORD)_NextAddInfo->ai_addrlen, NULL, _AddrString, &_AddrStringLen) == 0) { // 改为真实长度,这里的_AddrStringLen包含了末尾的字符#0,所以要减去这个#0的长度 _AddrStringLen--; Addrs.push_back(tstring(_AddrString)); OutputDebugStr(_T("ai_addr:%s,ai_flags:%d,ai_canonname=%s\n"), _AddrString, _NextAddInfo->ai_flags, _NextAddInfo->ai_canonname); } else { OutputDebugStr(_T("WSAAddressToString Error:%d\n"), WSAGetLastError()); } _NextAddInfo = _NextAddInfo->ai_next; } delete[] _AddrString; FreeAddrInfo(_ResultAddInfo); } delete[] sHostName; }
bool winsock2_streambuf::connect(const std::wstring & host, unsigned short port) { if (is_open()) { m_lasterror = std::make_error_code(std::errc::already_connected); return false; } addrinfo_type * addr = nullptr; bool res = do_resolve(host.c_str(), nullptr, &addr); if (!res) return false; set_port(addr, port); res = do_connect(addr); FreeAddrInfo(addr); return res; }
bool winsock2_streambuf::connect(const std::wstring & host, const std::wstring & service) { if (is_open()) { m_lasterror = std::make_error_code(std::errc::already_connected); return false; } addrinfo_type * addr = nullptr; bool res = do_resolve(host.c_str(), service.c_str(), &addr); if (!res) return false; assert(addr); res = do_connect(addr); FreeAddrInfo(addr); return res; }
static BOOL _socketConnect (PCSTR pszHost, PCSTR pszPort) { ADDRINFO *aiService = NULL, aiHint; BOOL bResult = FALSE; SOCKET sock = INVALID_SOCKET; int i; do { ZeroMemory (&aiHint, sizeof (aiHint)); aiHint.ai_family = AF_INET; aiHint.ai_socktype = SOCK_STREAM; aiHint.ai_protocol = IPPROTO_TCP; if (GetAddrInfo (pszHost, pszPort, &aiHint, &aiService) != 0) break; sock = socket (aiService->ai_family, aiService->ai_socktype, aiService->ai_protocol); if (sock == INVALID_SOCKET) break; i = 3000; setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&i, sizeof (i)); setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&i, sizeof (i)); if (connect (sock, aiService->ai_addr, (int)aiService->ai_addrlen) != 0) break; bResult = TRUE; } while (FALSE); if (aiService) FreeAddrInfo (aiService); if (sock) closesocket (sock); return bResult; }
static int GetAddrInfoNonLinux(const char* hostname, int port, struct addrinfo** addr_info) { // Get the host data depending on the OS. struct sockaddr_in* address; *addr_info = new struct addrinfo; memset(*addr_info, 0, sizeof(struct addrinfo)); address = new struct sockaddr_in; memset(address, 0, sizeof(struct sockaddr_in)); (*addr_info)->ai_addr = (struct sockaddr*) address; (*addr_info)->ai_addrlen = sizeof(struct sockaddr); (*addr_info)->ai_family = AF_INET; (*addr_info)->ai_socktype = SOCK_STREAM; struct hostent *name; #ifdef _WIN32 WSADATA wsaData; WSAStartup(MAKEWORD(1, 1), &wsaData); name = gethostbyname(hostname); #else name = gethostbyname(hostname); #endif if (name == NULL) { FreeAddrInfo(*addr_info); *addr_info = NULL; return -1; } // Fill in the appropriate variables to be able to connect to the server. address->sin_family = name->h_addrtype; memcpy((char *) &address->sin_addr.s_addr, name->h_addr_list[0], name->h_length); address->sin_port = htons(port); return 0; }
MPIPTVSOURCE_API int LeaveMulticastGroupIPv4(CLogger *logger, const TCHAR *protocolName, SOCKET m_socket, const struct sockaddr_in *source, const struct sockaddr_in *local, CParameterCollection *parameters) { ADDRINFOT *networkInterface = NULL; ADDRINFOT hints; hints.ai_family = local->sin_family; hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; hints.ai_flags = AI_PASSIVE; int result = 0; if (parameters != NULL) { // we have set some parameters // get interface parameter PCParameter networkInterfaceParameter = parameters->GetParameter(INTERFACE_PARAMETER_NAME, true); if (networkInterfaceParameter != NULL) { TCHAR *networkInterfaceAddress = GetInterfaceAddress(logger, protocolName, networkInterfaceParameter->GetValue(), local->sin_family); int errorCode = GetIpAddress(networkInterfaceAddress, 0, &networkInterface, &hints); if (errorCode != 0) { logger->Log(LOGGER_ERROR, _T("%s: %s: getaddrinfo() for network interface error: %d"), protocolName, METHOD_LEAVE_MULTICAST_GROUP_IPV4_NAME, errorCode); result = -1; } if (result == 0) { logger->Log(LOGGER_INFO, _T("%s: %s: try to bind on interface '%s', address: %s"), protocolName, METHOD_LEAVE_MULTICAST_GROUP_IPV4_NAME, networkInterfaceParameter->GetValue(), networkInterfaceAddress); } FREE_MEM(networkInterfaceAddress); } } if (result == 0) { union { struct ip_mreq gr4; struct ip_mreq_source gsr4; } opt; int cmd; struct in_addr id; if (networkInterface != NULL) { id = ((sockaddr_in *)networkInterface->ai_addr)->sin_addr; } else { id.s_addr = INADDR_ANY; } socklen_t optlen; memset(&opt, 0, sizeof(opt)); if (source != NULL) { cmd = IP_DROP_SOURCE_MEMBERSHIP; opt.gsr4.imr_multiaddr = local->sin_addr; opt.gsr4.imr_sourceaddr = source->sin_addr; opt.gsr4.imr_interface = id; optlen = sizeof (opt.gsr4); } else { cmd = IP_DROP_MEMBERSHIP; opt.gr4.imr_multiaddr = local->sin_addr; opt.gr4.imr_interface = id; optlen = sizeof(opt.gr4); } logger->Log(LOGGER_INFO, METHOD_MESSAGE_FORMAT, protocolName, METHOD_LEAVE_MULTICAST_GROUP_IPV4_NAME, (source != NULL) ? _T("IP_DROP_SOURCE_MEMBERSHIP multicast request") : _T("IP_DROP_MEMBERSHIP multicast request")); result = (SetSocketOption(logger, protocolName, METHOD_LEAVE_MULTICAST_GROUP_IPV4_NAME, (source != NULL) ? _T("IP_DROP_SOURCE_MEMBERSHIP") : _T("IP_DROP_MEMBERSHIP"), m_socket, IPPROTO_IP, cmd, (char *)&opt, optlen) == 0) ? 0 : (-1); } if (networkInterface != NULL) { FreeAddrInfo(networkInterface); networkInterface = NULL; } logger->Log(LOGGER_INFO, (result == 0) ? METHOD_END_FORMAT : METHOD_END_FAIL_FORMAT, protocolName, METHOD_LEAVE_MULTICAST_GROUP_IPV4_NAME); return result; }
HRESULT OpenURL(HWND hWnd) { HRESULT hr = S_OK; INT_PTR ret = DialogBox(hInst, MAKEINTRESOURCE(IDD_OPENURL), hWnd, OpenURLDlgProc); if (LOWORD(ret) == IDCANCEL) { return E_FAIL; } InvalidateRect(hWnd, NULL, TRUE); WCHAR wcDomain[MAX_URL_LENGTH] = {0}; DWORD cchDecodeUrl = 0; CoInternetParseUrl(g_wcURL, PARSE_DOMAIN, 0, wcDomain, MAX_URL_LENGTH, &cchDecodeUrl, 0); //int nbytes = WideCharToMultiByte(0, 0, g_szURL, nLength, NULL, 0, NULL, NULL); ZeroMemory(g_acURL, MAX_URL_LENGTH); WideCharToMultiByte(0, 0, g_wcURL, wcslen(g_wcURL), g_acURL, wcslen(g_wcURL), NULL, NULL); ZeroMemory(g_acDomain, MAX_URL_LENGTH); //nbytes = WideCharToMultiByte(0, 0, szDomain, wcslen(szDomain), NULL, 0, NULL, NULL); WideCharToMultiByte(0, 0, wcDomain, wcslen(wcDomain), g_acDomain, wcslen(wcDomain), NULL, NULL); char sendBuff[DEFAULT_BUFFER_LENGTH] = {0}; sprintf_s(sendBuff, DEFAULT_BUFFER_LENGTH, "HEAD %s HTTP/1.1\r\n" \ "Host: %s\r\n" \ "Proxy-Connection: keep-alive\r\n" \ "Proxy-Authorization: Basic ***********\r\n" \ "Accept: */*\r\n" \ "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36\r\n\r\n", strstr(g_acURL, g_acDomain)+strlen(g_acDomain), g_acDomain); int iResult = 0; ADDRINFOW* result = NULL; ADDRINFOW* ptr = NULL; ADDRINFOW hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; WCHAR* strProxyURL = L"test.proxy.com"; WCHAR* strProxyPort = L"8080"; iResult = GetAddrInfo(strProxyURL, strProxyPort, &hints, &result); if (iResult != 0) { ICSE_OUTPUTDEBUGSTRING_W(L"getaddrinfo failed: %d", iResult); return E_FAIL; } SOCKET connectSocket = INVALID_SOCKET; ptr = result; connectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (connectSocket == INVALID_SOCKET) { ICSE_OUTPUTDEBUGSTRING_W(L"socket failed: %ld\n", WSAGetLastError()); FreeAddrInfo(result); return E_FAIL; } int value = 0; int size = sizeof(value); iResult = getsockopt(connectSocket, SOL_SOCKET, SO_RCVBUF, (char*)&value, &size); iResult = connect(connectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); FreeAddrInfo(result); if (iResult == SOCKET_ERROR) { ICSE_OUTPUTDEBUGSTRING_W(L"connect failed: %d", iResult); closesocket(connectSocket); return E_FAIL; } char recvBuff[DEFAULT_BUFFER_LENGTH] = {0}; iResult = send(connectSocket, sendBuff, (int)strlen(sendBuff), 0); if (iResult == SOCKET_ERROR) { ICSE_OUTPUTDEBUGSTRING_W(L"send failed: %d", WSAGetLastError()); closesocket(connectSocket); return E_FAIL; } iResult = shutdown(connectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { ICSE_OUTPUTDEBUGSTRING_W(L"shutdown failed %d", WSAGetLastError()); closesocket(connectSocket); return E_FAIL; } CStringA strHeader(""); do { iResult = recv(connectSocket, recvBuff, DEFAULT_BUFFER_LENGTH, 0); if (iResult > 0) { strHeader += recvBuff; } else if (iResult == 0) { ICSE_OUTPUTDEBUGSTRING_W(L"Connection closed"); } else { ICSE_OUTPUTDEBUGSTRING_W(L"recv failed %d", WSAGetLastError()); } } while (iResult > 0); if (strHeader.GetLength() > 0) { int begin = strHeader.Find("Content-Length: "); int end = strHeader.Find("\r\n", begin); CStringA strLength = strHeader.Mid(begin + 16, end - begin - 16); __int64 length = _atoi64(strLength); ICSE_OUTPUTDEBUGSTRING_W(L"content length: %I64d", length); HANDLE hFile = ::CreateFile(g_wcFile, GENERIC_READ|GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); DWORD dwTemp = 0; ::DeviceIoControl(hFile, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &dwTemp, NULL); CloseHandle(hFile); __int64 segmentLength = length / g_factor; for (int i = 0; i < g_factor; i++) { g_segmentMatrix[i][0] = i * segmentLength; g_segmentMatrix[i][1] = g_segmentMatrix[i][0] + segmentLength - 1; length -= segmentLength; } g_segmentMatrix[g_factor-1][1] += length; for (int i = 0; i < g_factor; i++) { _beginthread(ThreadProc, 0, (void*)i); } } closesocket(connectSocket); return hr; }
void ThreadProc(void* param) { int index = (int)param; ICSE_OUTPUTDEBUGSTRING_W(L"[%d][%I64d:%I64d]", index, g_segmentMatrix[index][0], g_segmentMatrix[index][1]); __int64 begin = 0; __int64 end = g_segmentMatrix[index][0] - 1; __int64 backup = end; __int64 writeSize = 0LL; LOOP: int iResult = 0; ADDRINFOW* result = NULL; ADDRINFOW* ptr = NULL; ADDRINFOW hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; WCHAR szDomain[MAX_URL_LENGTH] = {0}; DWORD cchDecodeUrl = 0; CoInternetParseUrl(g_wcURL, PARSE_DOMAIN, 0, szDomain, MAX_URL_LENGTH, &cchDecodeUrl, 0); WCHAR* strProxyURL = L"test.proxy.com"; WCHAR* strProxyPort = L"8080"; iResult = GetAddrInfo(strProxyURL, strProxyPort, &hints, &result); if (iResult != 0) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]getaddrinfo failed: %d", index, iResult); } SOCKET connectSocket = INVALID_SOCKET; ptr = result; connectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (connectSocket == INVALID_SOCKET) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]socket failed: %ld\n", index, WSAGetLastError()); FreeAddrInfo(result); } int value = 0; int size = sizeof(value); iResult = getsockopt(connectSocket, SOL_SOCKET, SO_RCVBUF, (char*)&value, &size); iResult = connect(connectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); FreeAddrInfo(result); if (iResult == SOCKET_ERROR) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]connect failed: %d", index, iResult); closesocket(connectSocket); } do { begin = end + 1; end = ((begin + 32767) > g_segmentMatrix[index][1] ? g_segmentMatrix[index][1] : (begin + 32767)); char sendBuff[DEFAULT_BUFFER_LENGTH] = {0}; sprintf_s(sendBuff, DEFAULT_BUFFER_LENGTH, "GET %s HTTP/1.1\r\n" \ "Host: %s\r\n" \ "Proxy-Connection: keep-alive\r\n" \ "Proxy-Authorization: Basic ***********\r\n" \ "Accept: */*\r\n" \ "Range: bytes=%I64d-%I64d\r\n" "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36\r\n\r\n", strstr(g_acURL, g_acDomain)+strlen(g_acDomain), g_acDomain, begin, end); iResult = send(connectSocket, sendBuff, (int)strlen(sendBuff), 0); if (iResult == SOCKET_ERROR) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]send failed: %d", index, WSAGetLastError()); closesocket(connectSocket); } char recvBuff[DEFAULT_BUFFER_LENGTH * 33] = {0}; int recvLength = 0; char* dataAddress = NULL; bool bRecvSucess = false; do { iResult = recv(connectSocket, recvBuff + recvLength, DEFAULT_BUFFER_LENGTH * 33 - recvLength, 0); if (iResult > 0) { recvLength += iResult; ICSE_OUTPUTDEBUGSTRING_W(L"[%d]recv length %d", index, iResult); dataAddress = StrStrA(recvBuff, "\r\n\r\n") + 4; if ((recvLength - (dataAddress - recvBuff)) == (int)(end - begin + 1)) { bRecvSucess = true; break; } } else if (iResult == 0) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]Connection closed", index); } else { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]recv failed %d", index, WSAGetLastError()); } } while (iResult > 0); if (bRecvSucess) { HANDLE hFile = CreateFile(g_wcFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == NULL) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]file open failed %d", index, GetLastError()); break; } LONG llow = (LONG)(begin & 0x0FFFFFFFF); LONG lhigh = (LONG)((begin & 0xFFFFFFFF00000000)>>32); DWORD dwPrt = SetFilePointer(hFile, llow, &lhigh, FILE_BEGIN); if (dwPrt == INVALID_SET_FILE_POINTER) { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]move pointer failed %d", index, GetLastError()); break; } DWORD dwSize = 0; WriteFile(hFile, dataAddress, (int)(end - begin + 1), &dwSize, NULL); CloseHandle(hFile); backup = end; writeSize += (__int64)dwSize; g_segmentMatrix[index][2] =writeSize; InvalidateRect(g_hWndMain, NULL, TRUE); } else { ICSE_OUTPUTDEBUGSTRING_W(L"[%d]recv error! %d", index, recvLength); closesocket(connectSocket); end = backup; goto LOOP; } } while (end < g_segmentMatrix[index][1]);
BOOL CSocketObj::ConnectSer(CCustomIOCPBaseList &IOCPList, LPCTSTR SerAddr, int Port, int IncRefNumber) { BOOL resu = FALSE; ADDRINFOT _Hints; int _Retval; PADDRINFOT _ResultAddInfo; PADDRINFOT _NextAddInfo; DWORD _AddrStringLen; LPTSTR _AddrString; assert(mIsSerSocket == FALSE); ZeroMemory(&_Hints, sizeof(_Hints)); _Hints.ai_family = AF_UNSPEC; _Hints.ai_socktype = SOCK_STREAM; _Hints.ai_protocol = IPPROTO_TCP; _Retval = GetAddrInfo(SerAddr, to_tstring(Port).c_str(), &_Hints, &_ResultAddInfo); if (_Retval != 0) { return FALSE; } _NextAddInfo = _ResultAddInfo; // 申请缓冲区 _AddrString = new TCHAR[ADDR_STRING_MAX_LEN]; while (_NextAddInfo != NULL) { _AddrStringLen = ADDR_STRING_MAX_LEN; // 获取 #ifdef _DEBUG if (WSAAddressToString(_NextAddInfo->ai_addr, (DWORD)_NextAddInfo->ai_addrlen, NULL, _AddrString, &_AddrStringLen) == 0) { // 改为真实长度,这里的_AddrStringLen包含了末尾的字符#0,所以要减去这个#0的长度 _AddrStringLen--; OutputDebugStr(_T("ai_addr:%s,ai_flags:%d,ai_canonname=%s\n"), _AddrString, _NextAddInfo->ai_flags, _NextAddInfo->ai_canonname); } else { OutputDebugStr(_T("WSAAddressToString Error:%d\n"), WSAGetLastError()); } #endif mSock = WSASocket(_NextAddInfo->ai_family, _NextAddInfo->ai_socktype, _NextAddInfo->ai_protocol, NULL, 0, WSA_FLAG_OVERLAPPED); if (mSock != INVALID_SOCKET) { if (connect(mSock, _NextAddInfo->ai_addr, (INT)_NextAddInfo->ai_addrlen) == SOCKET_ERROR) { DWORD LastError = WSAGetLastError(); OutputDebugStr(_T("连接%s失败:%d\n"), _AddrString, LastError); closesocket(mSock); WSASetLastError(LastError); mSock = INVALID_SOCKET; } else { mOwner = &IOCPList; // 增加引用 IncRefCount(IncRefNumber); resu = IOCPList.AddSockBase(this); if (!resu) { DWORD LastError = WSAGetLastError(); OutputDebugStr(_T("添加%s到列表中失败:%d\n"), _AddrString, LastError); closesocket(mSock); WSASetLastError(LastError); mSock = INVALID_SOCKET; // 减少引用 DecRefCount(IncRefNumber); } break; } } _NextAddInfo = _NextAddInfo->ai_next; } delete[] _AddrString; FreeAddrInfo(_ResultAddInfo); return resu; }