Add server tcp api.
authorDaniele Basile <asterix@develer.com>
Mon, 23 Jan 2012 11:21:01 +0000 (12:21 +0100)
committerDaniele Basile <asterix@develer.com>
Mon, 23 Jan 2012 11:23:31 +0000 (12:23 +0100)
bertos/net/tcp_socket.c
bertos/net/tcp_socket.h

index 34a6ef66ee76567ba38f2a1016f3a18e13bda46a..65db328fb99c7b06c856b7359f49546450b75b7d 100644 (file)
@@ -85,6 +85,11 @@ static bool tcpsocket_reconnect(TcpSocket *socket)
        /* Close socket if was opened */
        close_socket(socket);
 
+       /* If we are in server mode we do nothing */
+       if (socket->handler)
+               return true;
+
+
        /* Start with new connection */
        socket->sock = netconn_new(NETCONN_TCP);
        if(!socket->sock)
@@ -261,9 +266,27 @@ static void tcpsocket_clearerr(KFile *fd)
        socket->error = 0;
 }
 
+void tcpsocket_serverPoll(KFile *fd)
+{
+       TcpSocket *socket = TCPSOCKET_CAST(fd);
+
+
+       if (!socket->sock)
+               socket->sock = netconn_accept(socket->server_sock);
+
+       if (!socket->sock)
+       {
+               LOG_ERR("Unable to connect with client\n");
+               return;
+       }
+
+       socket->handler(fd);
+}
+
 void tcpsocket_init(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *remote_addr, uint16_t port)
 {
-       socket->sock = NULL;
+       memset(socket, 0, sizeof(TcpSocket));
+
        socket->local_addr = local_addr;
        socket->remote_addr = remote_addr;
        socket->port = port;
@@ -277,3 +300,15 @@ void tcpsocket_init(TcpSocket *socket, struct ip_addr *local_addr, struct ip_add
        socket->fd.reopen = tcpsocket_reopen;
 
 }
+
+void tcpsocket_serverInit(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *listen_addr, uint16_t port, tcphandler_t handler)
+{
+       tcpsocket_init(socket, local_addr, listen_addr, port);
+       socket->handler = handler;
+
+       socket->server_sock = netconn_new(NETCONN_TCP);
+       socket->error = netconn_bind(socket->server_sock, listen_addr, port);
+       socket->error = netconn_listen(socket->server_sock);
+       if(socket->error != ERR_OK)
+               LOG_ERR("Init server\n");
+}
index 74ca1074e8209c0c8cde5270da83540fb676b077..a5eef82525224add2b206cd9c2ad520360beafb2 100644 (file)
 #include <lwip/netif.h>
 #include <lwip/ip_addr.h>
 
+typedef void (*tcphandler_t)(KFile *fd);
+
 typedef struct TcpSocket
 {
        KFile fd;                         ///< KFile context.
-       struct netconn *sock;             ///< Current sockect connection pointer.
+       struct netconn *sock;             ///< Current socket connection.
        struct netbuf *rx_buf_conn;       ///< Current received buffer from socket.
        size_t remaning_data_len;         ///< Number of bytes to read from the received buffer.
 
@@ -58,6 +60,9 @@ typedef struct TcpSocket
        uint16_t port;                    ///< Number port to connect.
 
        int error;                        ///< Error status.
+
+       struct netconn *server_sock;      ///< Server sockect connection.
+       tcphandler_t handler;             ///< TCP handler when are in server mode.
 } TcpSocket;
 
 #define KFT_TCPSOCKET MAKE_ID('T', 'S', 'C', 'K')
@@ -70,4 +75,7 @@ INLINE TcpSocket *TCPSOCKET_CAST(KFile *fd)
 
 void tcpsocket_init(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *remote_addr, uint16_t port);
 
+void tcpsocket_serverPoll(KFile *fd);
+void tcpsocket_serverInit(TcpSocket *socket, struct ip_addr *local_addr, struct ip_addr *remote_addr, uint16_t port, tcphandler_t handler);
+
 #endif /* NET_TCP_SOCKET_H */