本文整理汇总了C++中EndPoint::ToSockAddrIn方法的典型用法代码示例。如果您正苦于以下问题:C++ EndPoint::ToSockAddrIn方法的具体用法?C++ EndPoint::ToSockAddrIn怎么用?C++ EndPoint::ToSockAddrIn使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类EndPoint
的用法示例。
在下文中一共展示了EndPoint::ToSockAddrIn方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
OverlappedTransferBuffer *Socket::BeginReceive()
{
// UDP 'slave socket' is a socket descriptor on the server side that is a copy of the single UDP server listen socket.
// The slave sockets don't receive data directly, but the server socket is used instead to receive data for them.
if (IsUDPSlaveSocket())
{
#ifdef WIN32
assert(queuedReceiveBuffers.Size() == 0); // We shouldn't ever have queued a single receive buffer for this Socket.
#endif
return 0; // If we happen to come here, act as if the socket never received any data.
}
#ifdef WIN32
if (readOpen)
{
// Insert new empty receive buffers to the Overlapped Transfer receive queue until we have a full capacity queue primed.
const int capacityLeft = queuedReceiveBuffers.CapacityLeft();
for(int i = 0; i < capacityLeft; ++i)
EnqueueNewReceiveBuffer();
}
if (queuedReceiveBuffers.Size() == 0)
return 0;
OverlappedTransferBuffer *receivedData = *queuedReceiveBuffers.Front();
DWORD flags = 0;
BOOL ret = WSAGetOverlappedResult(connectSocket, &receivedData->overlapped, (LPDWORD)&receivedData->bytesContains, FALSE, &flags);
int error = (ret == TRUE) ? 0 : Network::GetLastError();
if (ret == TRUE)
{
queuedReceiveBuffers.PopFront();
// Successfully receiving zero bytes with overlapped sockets means the same as recv() of 0 bytes,
// peer has closed the write connection (but can still recv() until we also close the write connection).
if (receivedData->bytesContains == 0)
{
DeleteOverlappedTransferBuffer(receivedData);
// Urho3D: only close TCP sockets upon receiving 0 bytes
if (transport == SocketOverTCP && readOpen)
{
LOG(LogInfo, "Socket::BeginReceive: Received 0 bytes from the network. Read connection closed in socket %s.", ToString().c_str());
readOpen = false;
}
return 0;
}
return receivedData;
}
else if (error == WSAEDISCON)
{
queuedReceiveBuffers.PopFront();
DeleteOverlappedTransferBuffer(receivedData);
if (readOpen || writeOpen)
LOG(LogError, "Socket::BeginReceive: WSAEDISCON. Bidirectionally closing connection in socket %s.", ToString().c_str());
if (IsUDPServerSocket())
LOG(LogError, "Socket::BeginReceive: Unexpected: Received WSAEDISCON on UDP server socket!");
Close();
return 0;
}
else if (error != WSA_IO_INCOMPLETE)
{
queuedReceiveBuffers.PopFront();
if (readOpen || writeOpen)
if (!(IsUDPServerSocket() && error == 10054)) // If we are running both UDP server and client on localhost, we can receive 10054 (Peer closed connection) on the server side, in which case, we ignore this error print.
LOG(LogError, "Socket::BeginReceive: WSAGetOverlappedResult failed with code %d when reading from an overlapped socket! Reason: %s.", error, Network::GetErrorString(error).c_str());
DeleteOverlappedTransferBuffer(receivedData);
// Mark this socket closed, unless the read error was on a UDP server socket, in which case we must ignore
// the read error on this buffer (an error on a single client connection cannot shut down the whole server!)
if (!IsUDPServerSocket() && (readOpen || writeOpen))
{
LOG(LogError, "Socket::BeginReceive: Closing socket due to read error!");
Close();
}
}
return 0;
#else
if (!readOpen)
return 0;
const int receiveBufferSize = 4096;
OverlappedTransferBuffer *buffer = AllocateOverlappedTransferBuffer(receiveBufferSize);
EndPoint source;
buffer->bytesContains = Receive(buffer->buffer.buf, buffer->buffer.len, &source);
if (buffer->bytesContains > 0)
{
buffer->fromLen = sizeof(buffer->from);
buffer->from = source.ToSockAddrIn();
return buffer;
}
else
{
// Did not get any data. Delete the buffer immediately.
DeleteOverlappedTransferBuffer(buffer);
return 0;
}
#endif
}