Other Parts Discussed in Thread: CC3220SF
Tool/software: TI-RTOS
Hi,
i have a problem with receiving and sending tcp data. I use network_terminal example, sdk version 2.3.
my cc3220sf is used in ap mode and starts a tcp server. after starting the connection socket, clients can open connection sockets to communicate.
after a varying period of time, sl_select returns -2005L driver aborted. why? Please see my socket_cmd.c below
int32_t conn_socket = -1; int32_t comm_socket = -1; SlSockAddr_t *sa; /* Contains the local ip address and port */ SlSockAddr_t *csa; /* Contains the ip address and port of the connected peer. */ sockAddr_t sAddr; int32_t addrSize; SlFdSet_t masterFds; int32_t openConnectionSocket(uint16_t portNumber) { int32_t nonBlocking = TRUE; int32_t status; uint32_t i = 0; /* clear the global data buffer */ memset(&app_CB.gDataBuffer.nwData, 0x0 , sizeof(app_CB.gDataBuffer)); /* clear the global data buffer */ for (i = 0 ; i < MAX_BUF_SIZE ; i++) { app_CB.gDataBuffer.nwData[i] = (char)(i % 10); } /* filling the TCP server socket address */ sAddr.in4.sin_family = SL_AF_INET; sAddr.in4.sin_port = sl_Htons((unsigned short)portNumber); sAddr.in4.sin_addr.s_addr = SL_INADDR_ANY; sa = (SlSockAddr_t*)&sAddr.in4; csa = (SlSockAddr_t*)&sAddr.in4; addrSize = sizeof(SlSockAddrIn_t); /* * Open a TCP socket: * Since TCP is a connection oriented channel, * the opened socket would serve as 'welcome' socket, * on which we'll receive connection requests from clients. */ conn_socket = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, TCP_PROTOCOL_FLAGS); if (conn_socket < 0) { ASSERT_ON_ERROR(conn_socket, SL_SOCKET_ERROR); } /* Bind socket to server's port */ status = sl_Bind(conn_socket, sa, addrSize); if(status < 0) { UART_PRINT("[line:%d, error:%d] %s\r\n", __LINE__, status, SL_SOCKET_ERROR); sl_Close(conn_socket); return -1; } /* 'Listen' signify that wer'e ready to receive connection's from clients */ status = sl_Listen(conn_socket, 0); if(status < 0) { UART_PRINT("[line:%d, error:%d] %s\r\n", __LINE__, status, SL_SOCKET_ERROR); sl_Close(conn_socket); return -1; } status = sl_SetSockOpt(conn_socket, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking, sizeof(nonBlocking)); if(status < 0) { UART_PRINT("[line:%d, error:%d] %s\r\n", __LINE__, status, SL_SOCKET_ERROR); return -1; } comm_socket = SL_ERROR_BSD_EAGAIN; SL_SOCKET_FD_SET(conn_socket, &masterFds); } // Nonblocking, no-IPV6 Server int32_t StartTCPServer(uint16_t portNumber) { SlFdSet_t readFds; int32_t status; status = openConnectionSocket(portNumber); while(1) { readFds = masterFds; status = sl_Select(conn_socket, &readFds, 0, 0, 0); if (status <= 0) { UART_PRINT("select: Socket closed because of %d",status); UART_PRINT(lineBreak); } else if (SL_SOCKET_FD_ISSET(conn_socket,&readFds)) { if (comm_socket > 1) sl_Close(comm_socket); comm_socket = sl_Accept(conn_socket, (SlSockAddr_t*)&csa, (SlSocklen_t*)&addrSize); if (comm_socket < 0) { UART_PRINT("[line:%d, error:%d] %s comm_socket not accepted \r\n", __LINE__, comm_socket, SL_SOCKET_ERROR); continue; } else { SL_SOCKET_FD_SET(comm_socket, &masterFds); UART_PRINT(lineBreak); UART_PRINT("client connected"); UART_PRINT(lineBreak); } } } } void sendTCP(const char *pcBuffer, size_t uiBufLen) { _i16 status; _u16 bytesSent = 0; if (pcBuffer != NULL && uiBufLen > 0 && comm_socket != -1) { while(TRUE) { /* Send packet to client */ status = sl_Send(comm_socket, pcBuffer, (_i16) uiBufLen, 0); if(status == SL_ERROR_BSD_EAGAIN) { sleep(1); continue; } else if(status < 0) { UART_PRINT("no client connected [line:%d, error:%d] %s\r\n", __LINE__, status, SL_SOCKET_ERROR); break; } else if (status > 0 && (size_t) status == uiBufLen) { bytesSent = (_u16)uiBufLen; UART_PRINT("Sent 1 packet (%u bytes) successfully\r\n", bytesSent); break; } } } } size_t receiveTCP(char *pcBuffer, size_t uiBufLen) { _i16 status; _u16 bytesRcvd = 0; if (pcBuffer != NULL && uiBufLen > 0 && comm_socket > 0) { /* Receive packet from client */ status = sl_Recv(comm_socket, pcBuffer, uiBufLen, 0); if(status == SL_ERROR_BSD_EAGAIN || status == SL_ERROR_BSD_EBADF || status == 0) { /* No data received: Ignore and tell so */ bytesRcvd = 0; } else if(status < 0) { UART_PRINT("[line:%d, error:%d] %s\r\n", __LINE__, status, SL_SOCKET_ERROR); } else { bytesRcvd = status; UART_PRINT("Received 1 packet (%u bytes) successfully\r\n", bytesRcvd); if (bytesRcvd >= uiBufLen) { bytesRcvd = uiBufLen - 1; UART_PRINT("Warning: Data limited to %u bytes\r\n", bytesRcvd); } pcBuffer[bytesRcvd] = '\0'; } } return bytesRcvd; }