CC3200 TCP client 接收问题
时间:10-02
整理:3721RD
点击:
TI工程师:
我使用了两块CC3200进行TCP数据传输实验,其中一块作为服务器,另一块作为客户端,使用的是无阻塞的方式。为什么客户端调用sl_Recv( )函数接收数据时会有较长时间的延时,但服务器端就不会出现这种情况?并且为什么服务器连续给客户端发送几条数据,客户端接收时还会出现数据丢失的情况,同样的,服务器端却不会出现这种问题?
如果是非阻塞应该不会有delay, 你的代码是如何写的?
NonBlocking = 1;
iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET,\
SL_SO_NONBLOCKING, \
&NonBlocking, sizeof(NonBlocking));
if( iStatus < 0 )
{
// error
ERR_PRINTS("Socket Setting Err");
ASSERT_ON_ERROR(sl_Close(iSockID));
ASSERT_ON_ERROR(TCP_CLIENT_FAILED);
}
以下是我客户端TCP部分的代码:
int BsdTcpClient(unsigned short usPort) { SlSockAddrIn_t sAddr; int iAddrSize; int iSockID; int iStatus; //filling the TCP server socket address sAddr.sin_family = SL_AF_INET; sAddr.sin_port = sl_Htons((unsigned short)usPort); sAddr.sin_addr.s_addr = sl_Htonl((unsigned int)g_ulGatewayIP); iAddrSize = sizeof(SlSockAddrIn_t); // creating a TCP socket iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); if( iSockID < 0 ) { ASSERT_ON_ERROR(SOCKET_CREATE_ERROR); } // connecting to TCP server iStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize); if( iStatus < 0 ) { // error sl_Close(iSockID); ASSERT_ON_ERROR(CONNECT_ERROR); } //setting nonblokcking mode long lNonBlocking = 1; iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &lNonBlocking, sizeof(lNonBlocking)); if(iStatus < 0) { sl_Close(iSockID); UART_PRINT("TCP Client failed\n\r"); } //UART wireless transfer iStatus = WuartTransfer(UARTA0_BASE, iSockID); if(iStatus < 0) { UART_PRINT("WUART Transfer failed\n\r"); } iStatus = sl_Close(iSockID); //closing the socket after sending 1000 packets ASSERT_ON_ERROR(iStatus); return SUCCESS; }
int WuartTransfer(unsigned long ulBase, int iSockID) { char cTxBuf[100]; char cRxBuf[100]; char cGetChar; int iStatus; int iCounter = 0; while(1) { //UART receive characters cGetChar = MAP_UARTCharGetNonBlocking(ulBase); if(cGetChar != 0xff) {//Save received characterscTxBuf[iCounter++] = cGetChar;//Enter or Escif((cGetChar == 0x0d) || (cGetChar == 0x1b)){ //Send TCP packets iStatus = sl_Send(iSockID, cTxBuf, iCounter, 0); if(iStatus <= 0) {//errors handleASSERT_ON_ERROR(sl_Close(iSockID)); UART_PRINT("Sending data failed\n\r");break; } //enter if(cGetChar == 0x0d) {iCounter = 0; } //Esc, exit the loop elsebreak; } } //Receive TCP packets iStatus = sl_Recv(iSockID, cRxBuf, 100, 0); if(iStatus > 0) {//Enterif(cRxBuf[iStatus-1] == 0x0d){ //save"charaters ending" cRxBuf[iStatus]=0; Message(cRxBuf);}//Enter, exit the loopelse break; } } return(iStatus); }