本文整理汇总了C++中EndPoint::Reset方法的典型用法代码示例。如果您正苦于以下问题:C++ EndPoint::Reset方法的具体用法?C++ EndPoint::Reset怎么用?C++ EndPoint::Reset使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类EndPoint
的用法示例。
在下文中一共展示了EndPoint::Reset方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sizeof
Socket *Network::OpenListenSocket(unsigned short port, SocketTransportLayer transport, bool allowAddressReuse)
{
addrinfo *result = NULL;
addrinfo *ptr = NULL;
addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = (transport == SocketOverTCP) ? SOCK_STREAM : SOCK_DGRAM;
hints.ai_protocol = (transport == SocketOverTCP) ? IPPROTO_TCP : IPPROTO_UDP;
char strPort[256];
sprintf(strPort, "%d", (unsigned int)port);
int ret = getaddrinfo(NULL, strPort, &hints, &result);
if (ret != 0)
{
LOG(LogError, "getaddrinfo failed: %s", GetErrorString(ret).c_str());
return 0;
}
SOCKET listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
LOG(LogInfo, "Network::OpenListenSocket: Created listenSocket 0x%8X.", (unsigned int)listenSocket);
if (listenSocket == INVALID_SOCKET)
{
LOG(LogError, "Error at socket(): %s", GetLastErrorString().c_str());
freeaddrinfo(result);
return 0;
}
if (allowAddressReuse)
{
// Allow other sockets to be bound to this address after this.
// (Possibly unsecure, only enable for development purposes - to avoid having to wait for the server listen socket
// to time out if the server crashes.)
#ifdef WIN32
BOOL val = TRUE;
ret = setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
#else
int val = 1;
ret = setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
#endif
if (ret != 0)
LOG(LogError, "setsockopt to SO_REUSEADDR failed: %s", GetLastErrorString().c_str());
}
// It is safe to cast to a sockaddr_in, since we've specifically queried for AF_INET addresses.
sockaddr_in localAddress = *(sockaddr_in*)&result->ai_addr;
// Setup the listening socket - bind it to a local port.
// If we are setting up a TCP socket, the socket will be only for listening and accepting incoming connections.
// If we are setting up an UDP socket, all connection initialization and data transfers will be managed through this socket.
ret = bind(listenSocket, result->ai_addr, (int)result->ai_addrlen);
if (ret == KNET_SOCKET_ERROR)
{
LOG(LogError, "bind failed: %s when trying to bind to port %d with transport %s",
GetLastErrorString().c_str(), (int)port, transport == SocketOverTCP ? "TCP" : "UDP");
closesocket(listenSocket);
freeaddrinfo(result);
return 0;
}
freeaddrinfo(result);
// For a reliable TCP socket, start the server with a call to listen().
if (transport == SocketOverTCP)
{
// Transition the bound socket to a listening state.
ret = listen(listenSocket, SOMAXCONN);
if (ret == KNET_SOCKET_ERROR)
{
LOG(LogError, "Error at listen(): %s", GetLastErrorString().c_str());
closesocket(listenSocket);
return 0;
}
}
EndPoint localEndPoint = EndPoint::FromSockAddrIn(localAddress);
// We are starting up a server listen socket, which is not bound to an address. Use null address for the remote endpoint.
EndPoint remoteEndPoint;
remoteEndPoint.Reset();
const size_t maxSendSize = (transport == SocketOverTCP ? cMaxTCPSendSize : cMaxUDPSendSize);
sockets.push_back(Socket(listenSocket, localEndPoint, localHostName.c_str(), remoteEndPoint, "", transport, ServerListenSocket, maxSendSize));
Socket *listenSock = &sockets.back();
listenSock->SetBlocking(false);
return listenSock;
}