|
|
|
@ -144,7 +144,6 @@ namespace llarp
|
|
|
|
|
WSABUF wbuf = {(u_long)sz, static_cast< char* >(buf)};
|
|
|
|
|
// WSARecvFrom
|
|
|
|
|
llarp::LogDebug("read ", sz, " bytes from socket");
|
|
|
|
|
this->write = false;
|
|
|
|
|
int ret = ::WSARecvFrom(std::get< SOCKET >(fd), &wbuf, 1, nullptr, &flags,
|
|
|
|
|
addr, &slen, &portfd[0], nullptr);
|
|
|
|
|
// 997 is the error code for queued ops
|
|
|
|
@ -177,7 +176,6 @@ namespace llarp
|
|
|
|
|
}
|
|
|
|
|
// WSASendTo
|
|
|
|
|
llarp::LogDebug("write ", sz, " bytes into socket");
|
|
|
|
|
this->write = true;
|
|
|
|
|
ssize_t sent = ::WSASendTo(std::get< SOCKET >(fd), &wbuf, 1, nullptr, 0,
|
|
|
|
|
to, slen, &portfd[1], nullptr);
|
|
|
|
|
int s_errno = ::WSAGetLastError();
|
|
|
|
@ -297,16 +295,10 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
tcp_connect(struct llarp_tcp_connecter* tcp, const sockaddr* remoteaddr)
|
|
|
|
|
{
|
|
|
|
|
// create socket
|
|
|
|
|
DWORD on = 1;
|
|
|
|
|
SOCKET fd = ::socket(remoteaddr->sa_family, SOCK_STREAM, 0);
|
|
|
|
|
SOCKET fd = WSASocket(remoteaddr->sa_family, SOCK_STREAM, 0, nullptr, 0,
|
|
|
|
|
WSA_FLAG_OVERLAPPED);
|
|
|
|
|
if(fd == INVALID_SOCKET)
|
|
|
|
|
return false;
|
|
|
|
|
// set non blocking
|
|
|
|
|
if(ioctlsocket(fd, FIONBIO, &on) == SOCKET_ERROR)
|
|
|
|
|
{
|
|
|
|
|
::closesocket(fd);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
llarp::tcp_conn* conn = new llarp::tcp_conn(this, fd, remoteaddr, tcp);
|
|
|
|
|
add_ev(conn, true);
|
|
|
|
|
conn->connect();
|
|
|
|
@ -323,8 +315,8 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
llarp::ev_io*
|
|
|
|
|
bind_tcp(llarp_tcp_acceptor* tcp, const sockaddr* bindaddr)
|
|
|
|
|
{
|
|
|
|
|
DWORD on = 1;
|
|
|
|
|
SOCKET fd = ::socket(bindaddr->sa_family, SOCK_STREAM, 0);
|
|
|
|
|
SOCKET fd = WSASocket(bindaddr->sa_family, SOCK_STREAM, 0, nullptr, 0,
|
|
|
|
|
WSA_FLAG_OVERLAPPED);
|
|
|
|
|
if(fd == INVALID_SOCKET)
|
|
|
|
|
return nullptr;
|
|
|
|
|
socklen_t sz = sizeof(sockaddr_in);
|
|
|
|
@ -353,7 +345,6 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
llarp::ev_io* serv = new llarp::tcp_serv(this, fd, tcp);
|
|
|
|
|
tcp->impl = serv;
|
|
|
|
|
|
|
|
|
|
ioctlsocket(fd, FIONBIO, &on);
|
|
|
|
|
return serv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -375,28 +366,30 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
{
|
|
|
|
|
OVERLAPPED_ENTRY events[1024];
|
|
|
|
|
memset(&events, 0, sizeof(OVERLAPPED_ENTRY) * 1024);
|
|
|
|
|
ULONG numEvents = 0;
|
|
|
|
|
if(::GetQueuedCompletionStatusEx(iocpfd, events, 1024, &numEvents, ms,
|
|
|
|
|
false))
|
|
|
|
|
{
|
|
|
|
|
for(ULONG idx = 0; idx < numEvents; ++idx)
|
|
|
|
|
ULONG result = 0;
|
|
|
|
|
::GetQueuedCompletionStatusEx(iocpfd, events, 1024, &result, ms, false);
|
|
|
|
|
ULONG idx = 0;
|
|
|
|
|
while(idx < result)
|
|
|
|
|
{
|
|
|
|
|
llarp::ev_io* ev =
|
|
|
|
|
reinterpret_cast< llarp::ev_io* >(events[idx].lpCompletionKey);
|
|
|
|
|
if(ev && events[idx].lpOverlapped)
|
|
|
|
|
{
|
|
|
|
|
llarp::ev_io* ev =
|
|
|
|
|
reinterpret_cast< llarp::ev_io* >(events[idx].lpCompletionKey);
|
|
|
|
|
if(ev)
|
|
|
|
|
auto amount =
|
|
|
|
|
std::min(EV_READ_BUF_SZ, events[idx].dwNumberOfBytesTransferred);
|
|
|
|
|
if(ev->write)
|
|
|
|
|
ev->flush_write_buffers(amount);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
auto amount =
|
|
|
|
|
std::min(EV_READ_BUF_SZ, events[idx].dwNumberOfBytesTransferred);
|
|
|
|
|
memcpy(readbuf, events[idx].lpOverlapped->Pointer, amount);
|
|
|
|
|
ev->read(readbuf, amount);
|
|
|
|
|
memcpy(readbuf, events[idx].lpOverlapped->Pointer, amount);
|
|
|
|
|
ev->read(readbuf, amount);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
++idx;
|
|
|
|
|
}
|
|
|
|
|
tick_listeners();
|
|
|
|
|
if(numEvents)
|
|
|
|
|
return numEvents;
|
|
|
|
|
else
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ok apparently this isn't being used yet...
|
|
|
|
@ -454,8 +447,8 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
default:
|
|
|
|
|
return INVALID_SOCKET;
|
|
|
|
|
}
|
|
|
|
|
DWORD on = 1;
|
|
|
|
|
SOCKET fd = ::socket(addr->sa_family, SOCK_DGRAM, 0);
|
|
|
|
|
SOCKET fd = WSASocket(addr->sa_family, SOCK_DGRAM, 0, nullptr, 0,
|
|
|
|
|
WSA_FLAG_OVERLAPPED);
|
|
|
|
|
if(fd == INVALID_SOCKET)
|
|
|
|
|
{
|
|
|
|
|
perror("WSASocket()");
|
|
|
|
@ -485,7 +478,6 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
return INVALID_SOCKET;
|
|
|
|
|
}
|
|
|
|
|
llarp::LogDebug("socket fd is ", fd);
|
|
|
|
|
ioctlsocket(fd, FIONBIO, &on);
|
|
|
|
|
return fd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -584,7 +576,7 @@ struct llarp_win32_loop : public llarp_ev_loop
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
start_loop:
|
|
|
|
|
//PostQueuedCompletionStatus(iocpfd, 0, ev->listener_id, nullptr);
|
|
|
|
|
PostQueuedCompletionStatus(iocpfd, 0, ev->listener_id, nullptr);
|
|
|
|
|
handlers.emplace_back(ev);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|