Add win32 tcpsockets implementation.

This commit is contained in:
Peter Johnson
2015-08-04 00:01:13 -07:00
parent 4146db6fc8
commit 7d409f071e
4 changed files with 127 additions and 8 deletions

View File

@@ -23,13 +23,22 @@
#include "TCPStream.h"
#ifdef _WIN32
#include <WinSock2.h>
#else
#include <arpa/inet.h>
#include <unistd.h>
#endif
TCPStream::TCPStream(int sd, struct sockaddr_in* address) : m_sd(sd) {
char ip[50];
#ifdef _WIN32
unsigned long size = sizeof(ip) - 1;
WSAAddressToString((struct sockaddr*)address, sizeof sockaddr_in, nullptr, ip, &size);
#else
inet_ntop(PF_INET, (struct in_addr*)&(address->sin_addr.s_addr), ip,
sizeof(ip) - 1);
#endif
m_peerIP = ip;
m_peerPort = ntohs(address->sin_port);
}
@@ -41,11 +50,33 @@ std::size_t TCPStream::send(const char* buffer, std::size_t len, Error* err) {
*err = kConnectionClosed;
return 0;
}
#ifdef _WIN32
WSABUF wsaBuf;
wsaBuf.buf = const_cast<char*>(buffer);
wsaBuf.len = (ULONG)len;
DWORD rv;
bool result = true;
while (WSASend(m_sd, &wsaBuf, 1, &rv, 0, nullptr, nullptr) == SOCKET_ERROR) {
if (WSAGetLastError() != WSAEWOULDBLOCK) {
result = false;
break;
}
Sleep(1);
}
if (!result) {
char Buffer[128];
sprintf(Buffer, "Send() failed: WSA error=%d\n", WSAGetLastError());
OutputDebugStringA(Buffer);
*err = kConnectionReset;
return 0;
}
#else
ssize_t rv = write(m_sd, buffer, len);
if (rv < 0) {
*err = kConnectionReset;
return 0;
}
#endif
return static_cast<std::size_t>(rv);
}
@@ -55,12 +86,25 @@ std::size_t TCPStream::receive(char* buffer, std::size_t len, Error* err,
*err = kConnectionClosed;
return 0;
}
#ifdef _WIN32
int rv;
#else
ssize_t rv;
if (timeout <= 0)
#endif
if (timeout <= 0) {
#ifdef _WIN32
rv = recv(m_sd, buffer, len, 0);
#else
rv = read(m_sd, buffer, len);
else if (WaitForReadEvent(timeout))
#endif
}
else if (WaitForReadEvent(timeout)) {
#ifdef _WIN32
rv = recv(m_sd, buffer, len, 0);
#else
rv = read(m_sd, buffer, len);
else {
#endif
} else {
*err = kConnectionTimedOut;
return 0;
}
@@ -73,8 +117,13 @@ std::size_t TCPStream::receive(char* buffer, std::size_t len, Error* err,
void TCPStream::close() {
if (m_sd >= 0) {
#ifdef _WIN32
::shutdown(m_sd, SD_BOTH);
closesocket(m_sd);
#else
::shutdown(m_sd, SHUT_RDWR);
::close(m_sd);
#endif
}
m_sd = -1;
}