javacommons/comms/ipclib/socket/src/serversocket.cpp
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/comms/ipclib/socket/src/serversocket.cpp	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  ?Description
+*
+*/
+
+#include <sys/socket.h>
+#include <unistd.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <string.h>
+
+#include "logger.h"
+
+#include "serversocket.h"
+
+const int INVALID_SOCKET = 0;
+
+namespace java
+{
+namespace comms
+{
+
+
+ServerSocket::ServerSocket() : mSocket(INVALID_SOCKET)
+{
+//  JELOG2(EJavaComms);
+}
+
+ServerSocket::~ServerSocket()
+{
+    close();
+}
+
+int ServerSocket::open(int aPort)
+{
+//    JELOG2(EJavaComms);
+
+    mSocket = socket(AF_INET, SOCK_STREAM, 0);
+    if (mSocket == -1)
+    {
+        return -1;
+    }
+
+    int flag = 1;
+    setsockopt(mSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(int));
+
+    sockaddr_in addr;
+    addr.sin_family      = AF_INET;
+    addr.sin_port        = htons(aPort);
+    addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+    int rc = bind(mSocket, (sockaddr*)&addr, sizeof(addr));
+    if (rc != -1)
+    {
+        rc = listen(mSocket, 3);
+        if (rc != -1)
+        {
+            return 0;
+        }
+    }
+
+    ELOG2(EJavaComms, "listen failed %d - %s", errno, strerror(errno));
+    close();
+    return -1;
+}
+
+int ServerSocket::accept()
+{
+    sockaddr_in sa;
+    socklen_t saLen = sizeof(sa);
+
+    int socket = ::accept(mSocket, (sockaddr*)&sa, &saLen);
+    if (socket<0) ELOG2(EJavaComms, "accept failed %d - %s", errno, strerror(errno));
+
+    return socket;
+}
+
+int ServerSocket::close()
+{
+    int rc = 0;
+    if (mSocket !=INVALID_SOCKET)
+    {
+        rc = ::close(mSocket);
+        if (rc<0) ELOG2(EJavaComms, "close failed %d - %s", errno, strerror(errno));
+
+        mSocket = INVALID_SOCKET;
+    }
+    return rc;
+}
+
+int ServerSocket::getSocket() const
+{
+    return mSocket;
+}
+
+} // namespace comms
+} // namespace java
+