X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fnet%2Ftcp_socket.c;h=65db328fb99c7b06c856b7359f49546450b75b7d;hb=1a8a2b9b57118be3f52d1261ebefac3875e67bcf;hp=030f55f3351e50a7cb11ce0bb16bf3d50c03ddc2;hpb=e8b0472be10fba4ca6baa62d8d483db90e28c06e;p=bertos.git diff --git a/bertos/net/tcp_socket.c b/bertos/net/tcp_socket.c index 030f55f3..65db328f 100644 --- a/bertos/net/tcp_socket.c +++ b/bertos/net/tcp_socket.c @@ -40,8 +40,10 @@ #include "tcp_socket.h" -#define LOG_LEVEL LOG_LVL_INFO -#define LOG_FORMAT LOG_FMT_TERSE +#include "cfg/cfg_tcpsocket.h" + +#define LOG_LEVEL TCPSOCKET_LOG_LEVEL +#define LOG_FORMAT TCPSOCKET_LOG_FORMAT #include #include @@ -83,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) @@ -130,6 +137,15 @@ static KFile *tcpsocket_reopen(KFile *fd) return NULL; } +/* + * Read data from socket. + * + * The read return the bytes that had been received if they are less than we request too. + * Otherwise if the byte that we want read are less that the received bytes, we return only + * the requested bytes. To get the remaning bytes we need to make an others read, until the + * buffer is empty. + * When there are not any more bytes, a new read takes data from remote socket. + */ static size_t tcpsocket_read(KFile *fd, void *buf, size_t len) { TcpSocket *socket = TCPSOCKET_CAST(fd); @@ -173,10 +189,8 @@ static size_t tcpsocket_read(KFile *fd, void *buf, size_t len) } /* Try reconnecting if our socket isn't valid */ - LOG_INFO("sock[%s]\n", socket->sock ? "valido":"nullo"); if (!socket->sock && !tcpsocket_reconnect(socket)) return 0; - LOG_INFO("sock1[%s]\n", socket->sock ? "valido":"nullo"); while (len) { @@ -252,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; @@ -268,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"); +}