165 lines
4.5 KiB
C
165 lines
4.5 KiB
C
![]() |
#ifndef _ZJD_NET_PROCESS_H_
|
|||
|
#define _ZJD_NET_PROCESS_H_
|
|||
|
|
|||
|
#include "process.h"
|
|||
|
#include <sys/uio.h>
|
|||
|
|
|||
|
#define MAX_CONN_COUNT 8
|
|||
|
#define MAX_IOVEC_COUNT 1024
|
|||
|
|
|||
|
class CNetProcessItem : public CProcessItem
|
|||
|
{
|
|||
|
public:
|
|||
|
SOCKET m_sock;
|
|||
|
DWORD m_peer_addr;
|
|||
|
WORD m_peer_port;
|
|||
|
|
|||
|
protected:
|
|||
|
BYTE m_recv_data_buffer[MAX_NET_BUFFER_SIZE];
|
|||
|
int m_recv_data_len;
|
|||
|
|
|||
|
BYTE m_send_data_buffer[MAX_NET_BUFFER_SIZE];
|
|||
|
int m_send_data_len;
|
|||
|
|
|||
|
public:
|
|||
|
CNetProcessItem();
|
|||
|
virtual ~CNetProcessItem();
|
|||
|
|
|||
|
virtual void Attach(int uid, int sock = -1, DWORD peer_addr = 0, WORD peer_port = 0);
|
|||
|
virtual void Release(void); //释放相应的资源
|
|||
|
inline int GetSock(void) const
|
|||
|
{
|
|||
|
return ((int)m_sock);
|
|||
|
}
|
|||
|
|
|||
|
inline int GetBufferSpace(void) const
|
|||
|
{
|
|||
|
return (MAX_NET_BUFFER_SIZE - m_recv_data_len);
|
|||
|
}
|
|||
|
|
|||
|
inline int AppendBuffer(BYTE *pBuf, int count)
|
|||
|
{
|
|||
|
memcpy(&m_recv_data_buffer[m_recv_data_len], pBuf, count);
|
|||
|
m_recv_data_len += count;
|
|||
|
return m_recv_data_len;
|
|||
|
}
|
|||
|
|
|||
|
inline BYTE *GetBuffer(void)
|
|||
|
{
|
|||
|
return m_recv_data_buffer;
|
|||
|
}
|
|||
|
|
|||
|
inline int GetBufferLength(void) const
|
|||
|
{
|
|||
|
return m_recv_data_len;
|
|||
|
}
|
|||
|
|
|||
|
inline int PopBuffer(int count)
|
|||
|
{
|
|||
|
if (m_recv_data_len < count) return -1;
|
|||
|
m_recv_data_len -= count;
|
|||
|
if (m_recv_data_len == 0) return 0;
|
|||
|
memcpy(m_recv_data_buffer, &m_recv_data_buffer[count], m_recv_data_len);
|
|||
|
return m_recv_data_len;
|
|||
|
}
|
|||
|
|
|||
|
//int RecvFromNetwork(long timeout = -1);
|
|||
|
inline int WriteData(const BYTE* pBuf, int count, int ord = -1)
|
|||
|
{
|
|||
|
if (m_send_data_len + count > MAX_NET_BUFFER_SIZE)
|
|||
|
{
|
|||
|
//数据量大,将数据发送结束
|
|||
|
WriteToNetwork();
|
|||
|
//直接将数据发送结束。
|
|||
|
WriteToNetwork(pBuf, count);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
memcpy(&m_send_data_buffer[m_send_data_len], (void *)pBuf, count);
|
|||
|
m_send_data_len += count;
|
|||
|
}
|
|||
|
|
|||
|
return m_send_data_len;
|
|||
|
}
|
|||
|
inline int WriteToNetwork(void)
|
|||
|
{
|
|||
|
if (m_send_data_len > 0)
|
|||
|
{
|
|||
|
WriteToNetwork(m_send_data_buffer, m_send_data_len);
|
|||
|
m_send_data_len = 0;
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
int WriteToNetwork(const BYTE* pBuf, int count);
|
|||
|
int ReadFromNetwork(BYTE* pBuf, int count);
|
|||
|
};
|
|||
|
|
|||
|
class CNetProcess : public CProcess
|
|||
|
{
|
|||
|
//private:
|
|||
|
public:
|
|||
|
SOCKET m_sock;
|
|||
|
DWORD last_addr;
|
|||
|
WORD last_port;
|
|||
|
//public:
|
|||
|
//以下变量须在今后变更为配置参数
|
|||
|
int socket_type; //socket类型,TCP - SOCK_STREAM, UDP - SOCK_DGRAM
|
|||
|
DWORD bind_addr; //本地绑定地址
|
|||
|
WORD bind_port; //本地绑定端口
|
|||
|
|
|||
|
BOOLEAN ignored_source; //忽略来源地址
|
|||
|
DWORD target_addr; //目标地址,对于UDP若target_addr != 0则发送报文送往target_addr,否则送往单元地址
|
|||
|
WORD target_port; //目标端口
|
|||
|
|
|||
|
struNetWorkOption network;
|
|||
|
private:
|
|||
|
|
|||
|
public:
|
|||
|
CNetProcess();
|
|||
|
virtual ~CNetProcess();
|
|||
|
|
|||
|
virtual BOOLEAN OnPreCreate(int id);
|
|||
|
virtual void Destroy(void);
|
|||
|
virtual BOOLEAN Run(void);
|
|||
|
virtual BOOLEAN OnTimer(void);
|
|||
|
virtual int OnPackageReceived(BYTE* pBuf, int count, int ord = -1);
|
|||
|
|
|||
|
BOOLEAN isClient(void);
|
|||
|
BOOLEAN Connect(CNetProcessItem* pItem, int ord, BOOLEAN bDefault = FALSE);
|
|||
|
|
|||
|
DWORD WriteData(const BYTE* pData, int count, int ord = -1);
|
|||
|
#if 0
|
|||
|
DWORD ReadData(BYTE* pData, int count, int ord = -1);
|
|||
|
#endif
|
|||
|
virtual CNetProcessItem *CreateItem(int ord);
|
|||
|
virtual void DestroyItem(int ord, BOOLEAN bDeleted = FALSE); //bDeleted代表该对象是否已经被删除,用于在子类递归时防止重复删除对象
|
|||
|
inline virtual CNetProcessItem *GetItem(int ord) const
|
|||
|
{
|
|||
|
if (ord < 0 || ord >= PROCESS_UNIT_NUM) return NULL;
|
|||
|
return (CNetProcessItem *)m_pItems[ord];
|
|||
|
}
|
|||
|
|
|||
|
inline virtual CNetProcessItem *GetCurItem(void) const
|
|||
|
{
|
|||
|
return (CNetProcessItem *)GetItem(GetCurOrder());
|
|||
|
}
|
|||
|
|
|||
|
inline virtual CNetProcessItem *GetNextItem(void)
|
|||
|
{
|
|||
|
GetNextUnit();
|
|||
|
return (CNetProcessItem *)GetCurItem();
|
|||
|
}
|
|||
|
|
|||
|
BOOLEAN net_socket_nonblock(SOCKET sock, BOOLEAN blocking);
|
|||
|
#if 0
|
|||
|
int net__try_connect(const char *host, WORD port, SOCKET *sock, const char *bind_address, BOOLEAN blocking = FALSE);
|
|||
|
int net__try_connect_tcp(const char *host, WORD port, SOCKET *sock, const char *bind_address, BOOLEAN blocking = FALSE);
|
|||
|
#endif
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif //_ZJD_NET_PROCESS_H_
|
|||
|
|