From 74eca4a693eba544973e987f64e3ec88f95b3b73 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 29 Sep 2025 08:59:49 +0000 Subject: [PATCH] =?UTF-8?q?refactor=EF=BC=9A=E6=94=B9=E8=BF=9B=E4=BA=86=20?= =?UTF-8?q?TCPSoket=20=E7=9A=84=20send=20=E5=87=BD=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=B0=BD=E9=87=8F=E5=A4=9A=E5=9C=B0=E4=BC=A0=E8=BE=93=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 +- include/ouc_server/socket/tcp_socket.cpp | 24 +++++++++++++++++++++++- include/ouc_server/socket/tcp_socket.hpp | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7b8f5a..fc27440 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,5 +10,5 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -g -O2") add_subdirectory(${PROJECT_SOURCE_DIR}/include/ouc_server) -add_executable(test "${PROJECT_SOURCE_DIR}/examples/test_tcp_socket.cpp") +add_executable(test "${PROJECT_SOURCE_DIR}/examples/test_tcp_server.cpp") target_link_libraries(test PRIVATE ouc_server_lib) \ No newline at end of file diff --git a/include/ouc_server/socket/tcp_socket.cpp b/include/ouc_server/socket/tcp_socket.cpp index b3ae853..0de0f64 100644 --- a/include/ouc_server/socket/tcp_socket.cpp +++ b/include/ouc_server/socket/tcp_socket.cpp @@ -66,10 +66,32 @@ namespace ouc_server bool TCPSocket::close() { return ::close(listen_fd) == 0; } - ssize_t TCPSocket::send(const char *buf, size_t len) { return ::send(listen_fd, buf, len, 0); } + ssize_t TCPSocket::send(const char *buf, size_t len) + { + size_t sent = 0; + while (sent < len) + { + ssize_t n = ::send(listen_fd, buf + sent, len - sent, 0); + if (n < 0) + { + if (errno == EINTR) + continue; + if (errno == EAGAIN || errno == EWOULDBLOCK) + break; + return -1; + } + if (n == 0) + break; + sent += n; + } + + return sent; + } ssize_t TCPSocket::send(const char *buf) { return this->send(buf, sizeof(buf)); } + ssize_t TCPSocket::send(const std::string &str) { return this->send(str.c_str()); } + ssize_t TCPSocket::recv(void *buf, size_t len) { return ::recv(listen_fd, buf, len, 0); } } } \ No newline at end of file diff --git a/include/ouc_server/socket/tcp_socket.hpp b/include/ouc_server/socket/tcp_socket.hpp index a34357a..98bf5cf 100644 --- a/include/ouc_server/socket/tcp_socket.hpp +++ b/include/ouc_server/socket/tcp_socket.hpp @@ -35,6 +35,8 @@ namespace ouc_server public: ssize_t send(const char *, size_t); ssize_t send(const char *); + ssize_t send(const std::string &); + ssize_t recv(void *, size_t); }; }