Пример #1
0
int	Sockets_manager::AcceptFromHost(void)
{
	Socket*	skt;
	char	ip[16];

	skt = this->GetHostSocket();
	if (skt != NULL)
	{
		int		fdmax;
		fd_set		fdread;
		struct timeval	timeout;

		fdmax = skt->fd + 1;
		FD_ZERO(&fdread);
		FD_SET(skt->fd, &fdread);
		timeout.tv_sec = 0;
		timeout.tv_usec = 0;
		if (select(fdmax, &fdread, 0, 0, &timeout) == -1)
			return -1;
		if (FD_ISSET(skt->fd, &fdread))
		{
			skt->Accept(&fdmax, ip);
			if (fdmax != -1)
			{
				skt = NULL;
				while (skt == NULL)
					skt = new Socket(fdmax, ip);
				this->clientSockets.push_back(skt);
				return 1;
			}
		}
	}
	return 0;

}
Пример #2
0
int main(int argc, char **argv)
{
	print("151 - TCP Server | Centhra Engine v%s\n", getVersionString().c_str());

	Socket *server = Socket::Create(Socket::IP4, Socket::Stream, Socket::TCP, true);

	server->Bind(12345);
	server->Listen(16);

	while(true)
	{
		Socket *client = server->Accept();

		if(client)
		{
			char buff[1024];
			memset(buff, 0, 1024);
			client->Read(buff, 1024);
			print("Receiving Msg: %s\n", buff);

			client->Shutdown();
			delete client;
		}

		sleepMS(16);
	}

	delete server;

	return 0;
}
Пример #3
0
int Socket_accept(Context* ctx, Value& self)
{
    Socket* socket = static_cast<Socket*>(self.val.object);
    Socket* retSock = 0;
    SocketAddress* retAddr = 0;
    if (socket->Accept(&retSock, &retAddr)) {
        ctx->Push(retSock);
        ctx->Push(retAddr);
    } else {
        ctx->PushNull();
        ctx->PushNull();
    }
    return 2;
}
Пример #4
0
/*
 * Start job handler thread
 */
void* StartJobHandler(void* thread_args){
  int listen_port = *(int*) thread_args;
  std::cout << "StartJobHandler(" << listen_port << ")\n";
  //
  // Server socket
  //
  try {
    Socket server;
    if (!server.Create() ) {
      throw SocketException ( "Could not create server socket." );
    }

    if (!server.Bind(listen_port)) {
      throw SocketException ( "Could not bind to port." );
    }
    std::cout << "bind done" << std::endl;

    if ( ! server.Listen() ) {
      throw SocketException ( "Could not listen to socket." );
    }
    std::cout << "Waiting for incoming connections..." << std::endl;

    while ( true ) {
      Socket *client_sock = new Socket();
      std::cout << "before accept\n";
      //server.accept ( new_sock );
      if ( ! server.Accept(*client_sock )) {
          delete client_sock;
          throw SocketException ( "Could not accept socket." );
      }
      std::cout << "Connection accepted" << std::endl;
      pthread_t sniffer_thread;
      //thrd_args->socket = &client_sock;
      if (pthread_create(&sniffer_thread , NULL , JobHandlerConnectionHandler , (void*)client_sock) < 0) {
        //perror("could not create thread");
        std::cout << "could not create thread\n";
        delete client_sock;
        continue;
      }

      //Now join the thread , so that we dont terminate before the thread
      //pthread_join( sniffer_thread , NULL);
      std::cout <<"Handler assigned" << std::endl;
    }
  } catch ( SocketException& e ) {
    std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
  }
  return NULL;
}
Пример #5
0
unsigned long THREAD_FUNC SocketSubsystem::ListeningThread( void* Arg )
{
	SocketSubsystem* Subsystem = (SocketSubsystem*)Arg;

	ThreadStartupData StartupData;
	memset( &StartupData, 0, sizeof( StartupData ) );
	Subsystem->mListeningMutex.Aquire();
	Array<ThreadStartupData>& StartupDataList = Subsystem->mThreadStartupData;
	for( size_t i = 0; i < StartupDataList.Length(); ++i )
	{
		if( !StartupDataList[i].IsClaimed )
		{
			StartupDataList[i].IsClaimed = TRUE;
			StartupData = StartupDataList[i];
		}
	}
	Subsystem->mListeningMutex.Release();

	assert( StartupData.IsClaimed && StartupData.Socket != NULL && "Couldn't find startup data for socket listening thread" );

	Socket* ListeningSocket = StartupData.Socket;

	UBOOL ContinueListening = TRUE;
	while( ContinueListening && !fPendingDestroy )
	{
		// Blocking call
		ListeningSocket->Listen();
		
		// If we get here, we have gotten a new connection, accept it
		Socket* NewSocket = ListeningSocket->Accept();
		
		if( NewSocket != NULL && !fPendingDestroy )
		{
			Subsystem->mConnectionMutex.Aquire();
			Subsystem->mNewConnections.AddItem( NewSocket );
			Subsystem->mConnectionMutex.Release();
		}
		else if( NewSocket != NULL )
		{
			// CLEANUP, we allocated a socket while shutting down
			delete NewSocket;
		}

		Sleep( 10 );
	}

	return 0;
}
void EpollFrame::NewConnectMonitor()
{
#ifndef WIN32
	int nCount = MAXPOLLSIZE;
	epoll_event *events = new epoll_event[nCount];	//epoll事件
	int i = 0;
	Socket listenSock;
	Socket clientSock;

	while ( !m_stop )
	{
		nCount = MAXPOLLSIZE;
		if ( !((EpollMonitor*)m_pNetMonitor)->WaitConnect( events, nCount, -1 ) ) break; 

		for ( i = 0; i < nCount; i++ )
		{
			if ( ((EpollMonitor*)m_pNetMonitor)->IsStop(events[i].data.u64) ) 
			{
				delete[]events;
				return;
			}

			listenSock.Detach();
			listenSock.Attach((SOCKET)events[i].data.u64);
			while ( true )
			{
				listenSock.Accept( clientSock );
				if ( INVALID_SOCKET == clientSock.GetSocket() ) 
				{
					clientSock.Detach();
					break;
				}
				OnConnect(clientSock.Detach(), false);
			}
			if ( !m_pNetMonitor->AddAccept( listenSock.GetSocket() ) ) 
			{
				printf( "AddAccept (%d) error \n", listenSock.GetSocket() );
				listenSock.Close();
			}
		}
	}
	delete[]events;
#endif
}
Пример #7
0
bool SocketCom::Open()
{
	if (server)
	{
#ifdef TRACE
		printf("Opening server\n");
#endif
		Socket listener;
		if (!listener.Create()) return false;
#ifdef TRACE
		printf("Create OK\n");
#endif
		if (!listener.Bind(port)) return false;
#ifdef TRACE
		printf("Binding OK\n");
#endif
		if (!listener.Listen()) return false;
#ifdef TRACE
		printf("Listening OK\n");
#endif
		if (!listener.Accept(*this)) return false;
#ifdef TRACE
		printf("Accept OK\n");
#endif
	}
	else
	{
#ifdef TRACE
		printf("Opening client %s:%d\n",host,port);
#endif
		if (!Create()) return false;
#ifdef TRACE
	printf("Create OK\n");
#endif
		if (!Connect(host,port)) return false;
#ifdef TRACE
		printf("Connect OK\n");
#endif
		SetNonBlocking(true);
	}
	return true;
}
Пример #8
0
void* EpollMonitor::WaitAcceptEvent( void *pData )
{
#ifndef WIN32
	epoll_event *events = new epoll_event[m_nMaxMonitor];	//epoll事件
	Socket sock;
	Socket sockClient;
	SOCKET hSock;
	/* 等待有事件发生 */
	while ( !m_bStop )
	{
		int nPollCount = epoll_wait(m_hEPollAccept, events, m_nMaxMonitor, -1 );
		if ( -1 == nPollCount ) break;
		/* 处理所有事件,nfds 为返回发生事件数 */
		int i = 0;
		for ( i = 0; i < nPollCount; i++ ) 
		{
			if ( m_epollExit == events[i].data.fd ) 
			{
				::closesocket(m_epollExit);
				break;
			}
			
			sock.Detach();
			sock.Attach(events[i].data.fd);
			while ( true )
			{
				sock.Accept( sockClient );
				if ( INVALID_SOCKET == sockClient.GetSocket() ) break;
				sockClient.SetSockMode();
				hSock = sockClient.Detach();
				AddMonitor(hSock);
				while ( !m_acceptEvents->Push((void*)hSock) ) m_sigWaitAcceptSpace.Wait();
				m_ioSignal.Notify();
			}
		}
	}
	delete[]events;
#endif
	return NULL;
}
Пример #9
0
//
// Main function
//
int main (int argc, char **argv) {
  // Get hostname
  std::string hostname = SystemCommandUtils::Exec("hostname");
  std::cout << "Host name: " << hostname.c_str() << std::endl;

  // Redirect cout to log file <programe name>.stdout;
  char* app_name = argv[0];
  std::stringstream ss;
  ss << app_name << kLogExtension;
  std::string log_filename = ss.str();
  g_log_redirector = NULL;
  std::ofstream log_strm(log_filename.c_str());
  g_log_redirector = new StreamRedirector(std::cout, log_strm.rdbuf());

  ss.str("");
  ss << app_name << kErrExtension;
  std::string err_filename = ss.str();

  g_err_redirector = NULL;
  std::ofstream err_strm(err_filename.c_str());
  g_err_redirector = new StreamRedirector(std::cerr, err_strm.rdbuf());

  std::cout << "Host name: " << hostname.c_str() << std::endl;

  // Create job home path
  std::string homepath = getenv("HOME");
  g_home_job_dir = homepath + kJobDirName;
  std::cout << "Home job: " << g_home_job_dir << std::endl;
  if (argc < 2) {
    std::cout << "kdeskdaemon <port no>\n";
    delete g_err_redirector;
    delete g_log_redirector;
    return 1;
  }

  //
  // Server socket
  //
  try {
    // Create the socket
    //ServerSocket server ( 30000 );
    Socket server;
    g_kdesk_port = atoi(argv[1]);
    if (!server.Create() ) {
      throw SocketException ( "Could not create server socket." );
    }

    if (!server.Bind(g_kdesk_port)) {
      throw SocketException ( "Could not bind to port." );
    }
    std::cout << "bind done" << std::endl;

    if ( ! server.Listen() ) {
      throw SocketException ( "Could not listen to socket." );
    }
    std::cout << "Waiting for incoming connections..." << std::endl;


    while ( true ) {
      Socket* client_sock = new Socket();
      std::cout << "before accept\n";
      //server.accept ( new_sock );
      if ( ! server.Accept(*client_sock)) {
        delete client_sock;
        throw SocketException ( "Could not accept socket." );
      }
      std::cout << "Connection accepted" << std::endl;
      //ConnectionHandler((void*)&client_sock);
      //continue;

      pthread_t sniffer_thread;
      //thrd_args->socket = &client_sock;
      if (pthread_create( &sniffer_thread , NULL ,  ConnectionHandler , (void*)client_sock) < 0) {
        //perror("could not create thread");
        std::cout << "could not create thread\n";
        continue;
      }

      //Now join the thread , so that we dont terminate before the thread
      //pthread_join( sniffer_thread , NULL);
      std::cout <<"Handler assigned" << std::endl;
    }
  } catch ( SocketException& e ) {
    std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
  }

  if(g_log_redirector != NULL)
    delete g_log_redirector;
  if(g_err_redirector != NULL)
    delete g_err_redirector;
  return 0;
}
Пример #10
0
bool STNetEngine::LinuxIO( int timeout )
{
#ifndef WIN32
	int nCount = 0;
	int eventType = 0;
	int i = 0;
	Socket sockListen;
	Socket sockClient;
	SOCKET sock;
	map<SOCKET,int>::iterator it;
	pair<map<SOCKET,int>::iterator,bool> ret;
	
	//没有可io的socket则等待新可io的socket
	//否则检查是否有新的可io的socket,有则取出加入到m_ioList中,没有也不等待
	//继续进行m_ioList中的socket进行io操作
	if ( 0 >= m_ioList.size() ) nCount = m_pNetMonitor->WaitEvent( timeout );
	else nCount = m_pNetMonitor->WaitEvent( 0 );
	if ( 0 > nCount ) return false;
	//加入到m_ioList中
	for ( i = 0; i < nCount; i++ )
	{
		sock = m_pNetMonitor->GetSocket(i);
		if ( INVALID_SOCKET == sock ) return false;//STEpoll已关闭
		if ( m_pNetMonitor->IsAcceptAble(i) )//连接类型直接执行业务 
		{
			while ( true )
			{
				sockListen.Detach();
				sockListen.Attach(sock);
				sockListen.Accept( sockClient );
				if ( INVALID_SOCKET == sockClient.GetSocket() ) break;
				sockClient.SetSockMode();
				OnConnect(sockClient.Detach(), false);
			}
			continue;
		}
		//不是监听socket一定是io事件
		//加入到io列表,统一调度
		if ( m_pNetMonitor->IsWriteAble(i) ) eventType = 1|2;//recv+send事件
		else eventType = 1;//recv事件
		ret = m_ioList.insert(map<SOCKET,int>::value_type(sock,eventType) );//增加可io的对象
		if ( !ret.second ) ret.first->second = ret.first->second|eventType;//设置新事件
	}
	//遍历m_ioList,执行1次io
	for ( it = m_ioList.begin(); it != m_ioList.end(); it++ )
	{
		if ( 1&it->second ) //可读
		{
			if ( ok != OnData( it->first, 0, 0 ) ) //数据已读完或连接已断开
			{
				it->second = it->second&~1;//清除事件
			}
		}
		if ( 2&it->second ) //可写
		{
			if ( ok != OnSend( it->first, 0 ) )//数据已经发送完,或socket已经断开,或socket不可写
			{
				it->second = it->second&~2;//清除事件
			}
		}
	}
	
	//将不可io的socket清除
	it = m_ioList.begin();
	while (  it != m_ioList.end() ) 
	{
		if ( 0 == it->second ) 
		{
			m_ioList.erase(it);
			it = m_ioList.begin();
			continue;
		}
		it++;
	}
	return true;
#endif
	return false;
}