SmartOS/TinyIP/Tcp.h

79 lines
2.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _TinyIP_TCP_H_
#define _TinyIP_TCP_H_
#include "TinyIP.h"
// Tcp会话
class TcpSocket : public TinySocket, public ITransport, public Socket
{
private:
uint Seq; // 序列号,本地发出数据包
uint Ack; // 确认号,对方发送数据包的序列号+1
public:
// Tcp状态
typedef enum
{
Closed = 0,
SynSent = 1,
SynAck = 2,
Established = 3,
}TCP_STATUS;
//ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
//ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
//IPEndPoint Remote; // 远程地址。默认发送数据的目标地址
//IPEndPoint Local; // 本地地址
TCP_STATUS Status; // 状态
TCP_HEADER* Header;
TcpSocket(TinyIP* tip);
// 处理数据包
virtual bool Process(IP_HEADER& ip, Stream& ms);
// 连接远程服务器记录远程服务器IP和端口后续发送数据和关闭连接需要
bool Connect(IPAddress& ip, ushort port);
bool Disconnect(); // 关闭Socket
// 发送数据
virtual bool Send(const Buffer& bs);
// 接收数据
virtual uint Receive(Buffer& bs);
// 收到Tcp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包
typedef bool (*TcpHandler)(TcpSocket& socket, TCP_HEADER& tcp, byte* buf, uint len);
TcpHandler OnAccepted;
TcpHandler OnReceived;
TcpHandler OnDisconnected;
//virtual cstring ToString() const;
virtual String& ToStr(String& str) const;
protected:
void SendAck(uint len);
void SetSeqAck(TCP_HEADER& tcp, uint ackNum, bool cp_seq);
void SetMss(TCP_HEADER& tcp);
bool SendPacket(TCP_HEADER& tcp, uint len, byte flags);
virtual void OnProcess(TCP_HEADER& tcp, Stream& ms);
virtual void OnAccept(TCP_HEADER& tcp, uint len);
virtual void OnAccept3(TCP_HEADER& tcp, uint len);
virtual void OnDataReceive(TCP_HEADER& tcp, uint len);
virtual void OnDisconnect(TCP_HEADER& tcp, uint len);
virtual bool OnOpen();
virtual void OnClose();
virtual bool OnWrite(const Buffer& bs);
virtual uint OnRead(Buffer& bs);
private:
void* _wait = nullptr;
};
#endif