TCPSocket.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #pragma once
  2. #include <Kernel/Net/IPv4Socket.h>
  3. class TCPSocket final : public IPv4Socket {
  4. public:
  5. static NonnullRefPtr<TCPSocket> create(int protocol);
  6. virtual ~TCPSocket() override;
  7. enum class State {
  8. Disconnected,
  9. Connecting,
  10. Connected,
  11. Disconnecting,
  12. };
  13. State state() const { return m_state; }
  14. void set_state(State state) { m_state = state; }
  15. void set_ack_number(dword n) { m_ack_number = n; }
  16. void set_sequence_number(dword n) { m_sequence_number = n; }
  17. dword ack_number() const { return m_ack_number; }
  18. dword sequence_number() const { return m_sequence_number; }
  19. void send_tcp_packet(word flags, const void* = nullptr, int = 0);
  20. static Lockable<HashMap<word, TCPSocket*>>& sockets_by_port();
  21. static TCPSocketHandle from_port(word);
  22. private:
  23. explicit TCPSocket(int protocol);
  24. virtual const char* class_name() const override { return "TCPSocket"; }
  25. static NetworkOrdered<word> compute_tcp_checksum(const IPv4Address& source, const IPv4Address& destination, const TCPPacket&, word payload_size);
  26. virtual int protocol_receive(const ByteBuffer&, void* buffer, size_t buffer_size, int flags) override;
  27. virtual int protocol_send(const void*, int) override;
  28. virtual KResult protocol_connect(FileDescription&, ShouldBlock) override;
  29. virtual int protocol_allocate_local_port() override;
  30. virtual bool protocol_is_disconnected() const override;
  31. virtual KResult protocol_bind() override;
  32. dword m_sequence_number { 0 };
  33. dword m_ack_number { 0 };
  34. State m_state { State::Disconnected };
  35. };
  36. class TCPSocketHandle : public SocketHandle {
  37. public:
  38. TCPSocketHandle() {}
  39. TCPSocketHandle(RefPtr<TCPSocket>&& socket)
  40. : SocketHandle(move(socket))
  41. {
  42. }
  43. TCPSocketHandle(TCPSocketHandle&& other)
  44. : SocketHandle(move(other))
  45. {
  46. }
  47. TCPSocketHandle(const TCPSocketHandle&) = delete;
  48. TCPSocketHandle& operator=(const TCPSocketHandle&) = delete;
  49. TCPSocket* operator->() { return &socket(); }
  50. const TCPSocket* operator->() const { return &socket(); }
  51. TCPSocket& socket() { return static_cast<TCPSocket&>(SocketHandle::socket()); }
  52. const TCPSocket& socket() const { return static_cast<const TCPSocket&>(SocketHandle::socket()); }
  53. };