⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logging_handler.h

📁 ACE 学习代码。用ACE实现的学习代码
💻 H
字号:
/*
** Logging_Handler.h,v 1.4 2001/10/15 18:35:44 shuston Exp
**
** Copyright 2001 Addison Wesley. All Rights Reserved.
*/

#ifndef _LOGGING_HANDLER_H
#define _LOGGING_HANDLER_H

#include "ace/ACE.h"
#include "ace/CDR_Stream.h"
#include "ace/FILE_IO.h"
#include "ace/INET_Addr.h"
#include "ace/Message_Block.h"
#include "ace/os_include/os_netdb.h"
#include "ace/SOCK_Connector.h"
#include "ace/Synch.h" 
#include "ace/streams.h"
#include "ace/SOCK_Stream.h"
#include "ace/Thread.h"

static ACE_Thread_Mutex thread_mutex;

#define MAX_NAME_LENGTH 255

class ACE_Message_Block;

class Logging_Handler
{
protected:
  ACE_FILE_IO &log_file_; // Reference to a log file.
  ACE_SOCK_Stream logging_peer_; // Connected to the client.

public:

  // Initialization and termination methods.
  Logging_Handler (ACE_FILE_IO &log_file): log_file_ (log_file) {}
  Logging_Handler (ACE_FILE_IO &log_file,
                   ACE_HANDLE handle): log_file_ (log_file)
  { logging_peer_.set_handle (handle); }
  Logging_Handler (ACE_FILE_IO &log_file,
                   const ACE_SOCK_Stream &logging_peer)
    : log_file_ (log_file), logging_peer_ (logging_peer) {}
  int close () { return logging_peer_.close (); }

  // Receive one log record from a connected client.   Returns
  // length of record on success and <mblk> contains the
  // hostname, <mblk->cont()> contains the log record header
  // (the byte order and the length) and the data.  Returns -1 on
  // failure or connection close.

int Logging_Handler::recv_log_record (ACE_Message_Block *&mblk)
{
  //使用块链表保存收到信息
  ACE_INET_Addr peer_addr;
  logging_peer_.get_remote_addr (peer_addr);
  mblk = new ACE_Message_Block (MAXHOSTNAMELEN + 1);
  peer_addr.get_host_name (mblk->wr_ptr (), MAXHOSTNAMELEN);
  mblk->wr_ptr (strlen (mblk->wr_ptr ()) + 1); // Go past name
  // Allocate a message block for the payload; initially at least
  // large enough to hold the header, but needs some room for
  // alignment.
  ACE_Message_Block *payload =
    new ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE);
  // Align the Message Block for a CDR stream
  ACE_CDR::mb_align (payload);
  if (logging_peer_.recv_n (payload->wr_ptr (), 8) == 8) {
    payload->wr_ptr (8);               // Reflect addition of 8 bytes

    // Create a CDR stream to parse the 8-byte header.
    ACE_InputCDR cdr (payload);

    // Extract the byte-order and use helper methods to
    // disambiguate octet, booleans, and chars.
    ACE_CDR::Boolean byte_order;
    cdr >> ACE_InputCDR::to_boolean (byte_order);

    // Set the byte-order on the stream...
    cdr.reset_byte_order (byte_order);

    // Extract the length
    ACE_CDR::ULong length;
    cdr >> length;

    // Ensure there's sufficient room for log record payload.
    ACE_CDR::grow (payload, 8 + ACE_CDR::MAX_ALIGNMENT + length);

    // Use <recv_n> to obtain the contents.
    if (logging_peer_.recv_n (payload->wr_ptr (), length) > 0) {
      payload->wr_ptr (length);   // Reflect additional bytes
      // Chain the payload to mblk via the contination field.
      mblk->cont (payload);
	  
	  return length;	
    }
  }
  // Error cases end up here, so we need to release the memory to
  // prevent a leak.
  payload->release ();
  payload = 0;
  mblk->release ();
  mblk = 0;
  return -1;
}



  // Write one record to the log file.  The <mblk> contains the
  // hostname and the <mblk->cont> contains the log record.
  // Returns length of record written on success, or -1 on failure.

int Logging_Handler::write_log_record (ACE_Message_Block *mblk)
{
  CString m_Msg;
  CServerDlg *dlg=(CServerDlg*)AfxGetApp()->GetMainWnd();
  char* peer_host;
  peer_host=mblk->rd_ptr();
  char* user_recv;
  ACE_FILE_Connector connector;
  
  // Peer hostname is in the <mblk> and the log record data
  // is in its continuation.
  if(mblk->cont()->length()>MAX_NAME_LENGTH+8)//如果是文件,长度一定大于文件名长度+8
  {
    user_recv=mblk->cont()->rd_ptr()+8;
	if (dlg->MessageBox("是否接收数据?","提示",MB_YESNO)==IDYES)
	{	
			BROWSEINFO bInfo;
			bInfo.hwndOwner = dlg->m_hWnd;
			bInfo.pidlRoot  = NULL;
			char filename[MAX_PATH];
			char dir[MAX_PATH];
			memset(filename,0,MAX_PATH);
			memset(dir,0,MAX_PATH);
			
			bInfo.pszDisplayName = filename;
			bInfo.lpszTitle ="请选择目的路径";
			bInfo.ulFlags = BIF_BROWSEINCLUDEFILES|BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS|BIF_BROWSEFORCOMPUTER;
			bInfo.lParam  =NULL;
			bInfo.lpfn  =NULL;
			bInfo.iImage = 0;

			LPITEMIDLIST lpList =  SHBrowseForFolder(&bInfo);
			SHGetPathFromIDList(lpList,dir);
		
		CString save_path=dir;
		save_path+="\\";
		CString file_name=user_recv;
		connector.connect (log_file_,
							ACE_FILE_Addr (save_path+user_recv),
                            0, // No timeout.
                            ACE_Addr::sap_any, // Ignored.
                            0, // Don't try to reuse the addr.
                            O_RDWR|O_CREAT|O_APPEND,
                            ACE_DEFAULT_FILE_PERMS);
	}
  	if (log_file_.send_n(mblk->cont()->rd_ptr()+MAX_NAME_LENGTH+8,mblk->cont()->length()-MAX_NAME_LENGTH-8)==-1)
	{
		LocalFree(peer_host);
		LocalFree(user_recv);
  		return -1;
	}//写入文件tmp
	dlg->MessageBox("接收完毕!");
  }
  else//如果是文字信息
  {
    user_recv=mblk->cont()->rd_ptr()+8;
	user_recv[mblk->cont()->length()-8]='\0';//结束字符串
	if((user_recv[0]=='!'||user_recv[0]=='!')&&user_recv[1]=='\0')
	{	
		LocalFree(peer_host);
		LocalFree(user_recv);
		dlg->MessageBox("对方已退出!");
		return -1;
	}
    connector.connect (log_file_,
							ACE_FILE_Addr ("message.log"),
                            0, // No timeout.
                            ACE_Addr::sap_any, // Ignored.
                            0, // Don't try to reuse the addr.
                            O_RDWR|O_CREAT|O_APPEND,
                            ACE_DEFAULT_FILE_PERMS);
	if (log_file_.send_n(peer_host,strlen(peer_host))==-1)
	{
		LocalFree(peer_host);
		LocalFree(user_recv);
  		return -1;
	}//写入文件tmp
	if (log_file_.send_n(":",1)==-1)
	{
		LocalFree(peer_host);
		LocalFree(user_recv);
  		return -1;
	}//写入文件tmp
	if (log_file_.send_n(mblk->cont()->rd_ptr()+8,mblk->cont()->length()-8)==-1)
	{
		LocalFree(peer_host);
		LocalFree(user_recv);
  		return -1;
	}//写入文件tmp
	if (log_file_.send_n("  ",1)==-1)
	{
		LocalFree(peer_host);
		LocalFree(user_recv);
  		return -1;
	}//写入文件tmp
  }
  
  m_Msg.Format("From %s : %s",peer_host,user_recv);				
  thread_mutex.acquire();
  dlg->m_cMsg.AddString(m_Msg);
  thread_mutex.release();
  LocalFree(peer_host);
  LocalFree(user_recv);

  return mblk->total_length ();
}

  // Log one record by calling <recv_log_record> and
  // <write_log_record>.  Returns 0 on success and -1 on failure.
int Logging_Handler::log_record ()
{
  ACE_Message_Block *mblk = 0;
  if (recv_log_record (mblk) == -1)
    return -1;
  else {
    int result = write_log_record (mblk);
    mblk->release (); // Free up the contents.
    log_file_.close ();
    return result == -1 ? -1 : 0;
  }
}
	
  // Accessor method.
  ACE_SOCK_Stream &peer () { return logging_peer_; }
};

#endif /* _LOGGING_HANDLER_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -