void PascalSystem::Socket::SocketServerAbstract::listenSocket() { socketServerBag->socketServer = sock; while (running) { int clnSock = getAcceptedSocket(); if (clnSock == -1) { usleep(10000); } else { if (!acceptedSocketHandler(clnSock, socketServerBag)) { close(clnSock); } } } socketServerBag->socketServer = -1; closeSocket(); }
SocketIPv4 *SocketIPv4::accept() { struct sockaddr_in addr; SOCKET result = getAcceptedSocket(&addr); SocketIPv4 *accepted; try { accepted = new SocketIPv4(); accepted->close(); } catch(...) { // Cleanup and throw further #ifdef _WIN32 ::closesocket(result); #else ::close(result); #endif throw SocketException(); } AutoLock l(&accepted->m_mutex); // Fall out with exception, no need to check if accepted is NULL accepted->m_socket = result; // Set local and peer addresses for accepted socket accepted->m_peerAddr = new SocketAddressIPv4(addr); struct sockaddr_in localAddr; socklen_t addrlen = sizeof(struct sockaddr_in); if (getsockname(result, (struct sockaddr *)&localAddr, &addrlen) == 0) { accepted->m_localAddr = new SocketAddressIPv4(localAddr); } return accepted; // Valid and initialized }