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); }; }