SNICInterface for development
Fork of SNICInterface by
Diff: Socket/TCPSocketServer.cpp
- Revision:
- 32:ae95309643aa
- Parent:
- 29:6a0ba999597d
- Child:
- 36:f33fcf5975ab
diff -r 15c22824cc46 -r ae95309643aa Socket/TCPSocketServer.cpp --- a/Socket/TCPSocketServer.cpp Thu May 29 03:23:21 2014 +0000 +++ b/Socket/TCPSocketServer.cpp Fri May 30 08:30:40 2014 +0000 @@ -28,6 +28,7 @@ * $Revision: 0.0.0.1 $ * ***********************************************************************/ #include "TCPSocketServer.h" +#include "SNIC_Core.h" #include <cstring> @@ -39,17 +40,141 @@ { } -int TCPSocketServer::bind(int port) +int TCPSocketServer::bind(unsigned short port) { + int ret; + C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); + C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand(); + + // Get local ip address. + // Get buffer for response payload from MemoryPool + tagMEMPOOL_BLOCK_T *payload_buf = snic_core_p->allocCmdBuf(); + if( payload_buf == NULL ) + { + printf("bind payload_buf NULL\r\n"); + return -1; + } + + C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T req; + // Make request + req.cmd_sid = UART_CMD_SID_SNIC_GET_DHCP_INFO_REQ; + req.seq = mUartRequestSeq++; + req.interface = 0; + + unsigned char command_array[UART_REQUEST_PAYLOAD_MAX]; + unsigned int command_len; + // Preparation of command + command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req + , sizeof(C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T), payload_buf->buf, command_array ); + // Send uart command request + snic_core_p->sendUart( command_len, command_array ); + // Wait UART response + ret = uartCmdMgr_p->wait(); + if( ret != 0 ) + { + printf( "bind failed\r\n" ); + snic_core_p->freeCmdBuf( payload_buf ); + return -1; + } + + if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS ) + { + printf("bind status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); + snic_core_p->freeCmdBuf( payload_buf ); + return -1; + } + + snic_core_p->freeCmdBuf( payload_buf ); + + unsigned int local_addr = (payload_buf->buf[9] << 24) + | (payload_buf->buf[10] << 16) + | (payload_buf->buf[11] << 8) + | (payload_buf->buf[12]); + + // Socket create + ret = createSocket( 1, local_addr, port ); + if( ret != 0 ) + { + printf("bind error : %d\r\n", ret); + return -1; + } + return 0; } int TCPSocketServer::listen(int max) { + C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); + C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand(); + + // Get buffer for response payload from MemoryPool + tagMEMPOOL_BLOCK_T *payload_buf = snic_core_p->allocCmdBuf(); + if( payload_buf == NULL ) + { + printf("listen payload_buf NULL\r\n"); + return -1; + } + + C_SNIC_Core::tagSNIC_TCP_CREATE_CONNECTION_REQ_T req; + // Make request + req.cmd_sid = UART_CMD_SID_SNIC_TCP_CREATE_CONNECTION_REQ; + req.seq = mUartRequestSeq++; + req.socket_id = mSocketID; + req.recv_bufsize[0] = ( (SNIC_UART_RECVBUF_SIZE & 0xFF00) >> 8 ); + req.recv_bufsize[1] = (SNIC_UART_RECVBUF_SIZE & 0xFF); + req.max_client = max; + + unsigned char command_array[UART_REQUEST_PAYLOAD_MAX]; + unsigned int command_len; + // Preparation of command + command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req + , sizeof(C_SNIC_Core::tagSNIC_TCP_CREATE_CONNECTION_REQ_T), payload_buf->buf, command_array ); + + int ret; + + // Send uart command request + snic_core_p->sendUart( command_len, command_array ); + + // Wait UART response + ret = uartCmdMgr_p->wait(); + if( ret != 0 ) + { + printf( "listen failed\r\n" ); + snic_core_p->freeCmdBuf( payload_buf ); + return -1; + } + + if( uartCmdMgr_p->getCommandStatus() != 0 ) + { + printf("listen status:%02x\r\n", uartCmdMgr_p->getCommandStatus()); + snic_core_p->freeCmdBuf( payload_buf ); + return -1; + } + + snic_core_p->freeCmdBuf( payload_buf ); return 0; } -int TCPSocketServer::accept(TCPSocketConnection& connection) +int TCPSocketServer::accept(TCPSocketConnection *connection) { - return 0; + C_SNIC_Core *snic_core_p = C_SNIC_Core::getInstance(); + int i; + int ret = -1; + + C_SNIC_Core::tagCONNECT_INFO_T *con_info_p; + for( i = 0; i < MAX_SOCKET_ID+1; i++ ) + { + // Get connection information + con_info_p = snic_core_p->getConnectInfo( i ); + if( (con_info_p->is_connected == true) + && (con_info_p->is_accept == true) + && (con_info_p->parent_socket == mSocketID) ) + { + // Set socket id + connection->setAcceptSocket( i ); + ret = 0; + } + } + + return ret; }