SmartOS/TinyIP/Tcp.h

82 lines
2.3 KiB
C++
Raw 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 Socket, public ITransport
{
private:
//byte seqnum;
uint Seq; // 序列号,本地发出数据包
uint Ack; // 确认号,对方发送数据包的序列号+1
TCP_HEADER* Create();
public:
// Tcp状态
typedef enum
{
Closed = 0,
SynSent = 1,
SynAck = 2,
Established = 3,
}TCP_STATUS;
ushort Port; // 本地端口接收该端口数据包。0表示接收所有端口的数据包
ushort BindPort; // 绑定端口用于发出数据包的源端口。默认为Port若Port为0则从1024算起累加
IPAddress RemoteIP; // 远程地址
ushort RemotePort; // 远程端口
IPAddress LocalIP; // 本地IP地址
ushort LocalPort; // 本地端口,收到数据包的目的端口
TCP_STATUS Status; // 状态
TCP_HEADER* Header;
TcpSocket(TinyIP* tip);
// 处理数据包
virtual bool Process(Stream* ms);
bool Connect(IPAddress ip, ushort port); // 连接远程服务器记录远程服务器IP和端口后续发送数据和关闭连接需要
void Send(const byte* buf, uint len); // 向Socket发送数据可能是外部数据包
void Disconnect(); // 关闭Socket
// 收到Tcp数据时触发传递结构体和负载数据长度。返回值指示是否向对方发送数据包
typedef bool (*TcpHandler)(TcpSocket* socket, TCP_HEADER* tcp, byte* buf, uint len);
TcpHandler OnAccepted;
TcpHandler OnReceived;
TcpHandler OnDisconnected;
virtual string ToString();
protected:
void SendAck(uint len);
void SetSeqAck(TCP_HEADER* tcp, uint ackNum, bool cp_seq);
void SetMss(TCP_HEADER* tcp);
void Send(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 byte* buf, uint len);
virtual uint OnRead(byte* buf, uint len);
};
// Tcp客户端
/*class TcpClient : public TcpSocket
{
public:
TcpClient(TinyIP* tip);
};*/
#endif