From 18534c8c54c544a7078f8ecdf917f8e1eb0fa3cf Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Sat, 15 Aug 2020 08:40:28 +0300 Subject: [PATCH] Improve peer unit test for windows --- components/net/cpp/src/net_internal.hpp | 2 ++ components/net/cpp/src/peer.cpp | 8 ++++++-- components/net/cpp/test/peer_unit.cpp | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/components/net/cpp/src/net_internal.hpp b/components/net/cpp/src/net_internal.hpp index 77aab1eca..fa116a675 100644 --- a/components/net/cpp/src/net_internal.hpp +++ b/components/net/cpp/src/net_internal.hpp @@ -11,6 +11,7 @@ namespace ftl { namespace net { namespace internal { #ifdef WIN32 int recv(SOCKET sd, char *buf, int n, int f); int send(SOCKET sd, const char *v, int cnt, int flags); + int writev(SOCKET sd, LPWSABUF v, DWORD cnt, LPDWORD sent); #else ssize_t recv(int sd, void *buf, size_t n, int f); ssize_t writev(int sd, const struct iovec *v, int cnt); @@ -19,6 +20,7 @@ namespace ftl { namespace net { namespace internal { #ifdef WIN32 inline int recv(SOCKET sd, char *buf, int n, int f) { return ::recv(sd,buf,n,f); } inline int send(SOCKET sd, const char *v, int cnt, int flags) { return ::send(sd,v,cnt,flags); } + inline int writev(SOCKET sd, LPWSABUF v, DWORD cnt, LPDWORD sent) { return ::WSASend(sd, v, cnt, sent, 0, NULL, NULL); } #else #if defined _DEBUG && DEBUG_NET inline ssize_t recv(int sd, void *buf, size_t n, int f) { diff --git a/components/net/cpp/src/peer.cpp b/components/net/cpp/src/peer.cpp index b3e2424f1..db544841e 100644 --- a/components/net/cpp/src/peer.cpp +++ b/components/net/cpp/src/peer.cpp @@ -180,6 +180,7 @@ Peer::Peer(SOCKET s, Universe *u, Dispatcher *d) : sock_(s), can_reconnect_(fals outgoing_ = false; local_id_ = local_peer_ids__++; + #ifndef TEST_MOCKS int flags =1; if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char *)&flags, sizeof(flags))) { LOG(ERROR) << "ERROR: setsocketopt(), TCP_NODELAY"; }; int a = static_cast<int>(u->getRecvBufferSize()); @@ -190,6 +191,7 @@ Peer::Peer(SOCKET s, Universe *u, Dispatcher *d) : sock_(s), can_reconnect_(fals if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, (const char *)&a, sizeof(int)) == -1) { fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); } + #endif // Send the initiating handshake if valid if (status_ == kConnecting) { @@ -699,7 +701,8 @@ int Peer::_send() { } DWORD bytessent; - c = WSASend(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent, 0, NULL, NULL); + //c = WSASend(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent, 0, NULL, NULL); + c = ftl::net::internal::writev(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent); #else c = ftl::net::internal::writev(sock_, send_buf_.vector(), (int)send_buf_.vector_size()); #endif @@ -717,7 +720,8 @@ int Peer::_send() { } DWORD bytessent; - c = WSASend(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent, 0, NULL, NULL); + //c = WSASend(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent, 0, NULL, NULL); + c = ftl::net::internal::writev(sock_, wsabuf.data(), static_cast<DWORD>(send_size), (LPDWORD)&bytessent); #else c = ftl::net::internal::writev(sock_, send_buf_.vector(), (int)send_buf_.vector_size()); #endif diff --git a/components/net/cpp/test/peer_unit.cpp b/components/net/cpp/test/peer_unit.cpp index c4ace7179..6b2cd2bd2 100644 --- a/components/net/cpp/test/peer_unit.cpp +++ b/components/net/cpp/test/peer_unit.cpp @@ -85,11 +85,25 @@ ssize_t ftl::net::internal::recv(SOCKET sd, void *buf, size_t n, int f) { } #ifdef WIN32 -int ftl::net::internal::send(SOCKET sd, const char *v, int cnt, int flags) { +/*int ftl::net::internal::send(SOCKET sd, const char *v, int cnt, int flags) { int len = cnt; // TODO(nick) merge multiple sends fakedata[sd] = std::string(v, len); return len; +}*/ +int ftl::net::internal::writev(SOCKET sd, LPWSABUF v, DWORD cnt, LPDWORD sent) { + size_t len = 0; //v[0].iov_len+v[1].iov_len; + char buf[1000]; + char *bufp = &buf[0]; + + for (auto i=0; i<cnt; i++) { + std::memcpy(bufp,v[i].buf,v[i].len); + len += v[i].len; + bufp += v[i].len; + } + + fakedata[sd] = std::string(&buf[0], len); + return len; } #else ssize_t ftl::net::internal::writev(int sd, const struct iovec *v, int cnt) { -- GitLab