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();
}
Exemple #2
0
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
}