map/das-dn/inc/netproc.h

165 lines
4.5 KiB
C
Raw Normal View History

2024-07-08 10:27:17 +08:00
#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_