예제 #1
0
bool CServer::CreateListenSocket(CStdString ports, bool ssl)
{
	bool success = true;

	ports += _T(" ");
	int pos = ports.Find(' ');
	while (pos > 0) {
		CStdString ipBindings = (m_pOptions ? m_pOptions->GetOption(OPTION_IPBINDINGS) : _T("*"));
		int nPort = _ttoi(ports.Left(pos));
		ports = ports.Mid(pos + 1);
		pos = ports.Find(' ');

		CStdString str;
		str.Format(_T("Creating listen socket on port %d..."), nPort);
		ShowStatus(str, 0);
		if (ipBindings.empty() || ipBindings == _T("*")) {
			ipBindings = _T("::0 0.0.0.0");
		}
			
		bool bError = false;
		str.Format(_T("Failed to bind the listen socket on port %d to the following IPs:"), nPort);
		ipBindings += _T(" ");
		while (ipBindings != _T("")) {
			int pos = ipBindings.Find(' ');
			if (pos == -1)
				break;
			CStdString ip = ipBindings.Left(pos);
			ipBindings = ipBindings.Mid(pos + 1);
			CListenSocket *pListenSocket = new CListenSocket(*this, m_ThreadArray, ssl);

			int family;
			if (ip.Find(':') != -1)
				family = AF_INET6;
			else
				family = AF_INET;

			if (!pListenSocket->Create(nPort, SOCK_STREAM, FD_ACCEPT, ip, family) || !pListenSocket->Listen(32)) {
				delete pListenSocket;
				bError = true;
				str += _T(" ") + ip;
			}
			else
				m_ListenSocketList.push_back(pListenSocket);
		}
		if (bError) {
			ShowStatus(str, 1);
			success = false;
		}
	}

	return success;
}