TCP的connect 一直阻塞,要在udp发送数据以后,才能connect成功?求解
时间:10-02
整理:3721RD
点击:
用cc3000和stm32f10系列的mcu搭配,移植spi驱动的初期存在了一些问题,后来都是通过把杜邦线减短来解决了问题,现在杜邦线连接cc3000和stm32,线长9cm左右,可以连接到固定AP名称的路由器上,存在以下的问题:
1,UDP发送时,第一个数据包网络调试助手接收不到,后面的都能接收到。部分代码如下:
选择建立的socket类型
case UART_COMMAND_SOCKET_OPEN: linktype=atoshort(usBuffer[2], usBuffer[3]); if(linktype==1) ulSocket = socket(2,2,17);//AF_Init SOCK_DGRAM UDP else if(linktype==2) ulSocket = socket(2,1,6);//AF_Init SOCK_STREAM TCP else ulSocket = socket(2,2,17);
udp发送数据:
case UART_COMMAND_SEND_DATA:pcData = (char *)&usBuffer[4];ulDataLength = atoshort(usBuffer[2], usBuffer[3]);pcSockAddrAscii = (pcData + ulDataLength); tSocketAddr.sa_family =2; // the destination port tSocketAddr.sa_data[0] = ascii_to_char(pcSockAddrAscii[0], pcSockAddrAscii[1]);tSocketAddr.sa_data[1] = ascii_to_char(pcSockAddrAscii[2], pcSockAddrAscii[3]);// the destination porttSocketAddr.sa_data[2] = ascii_to_char(pcSockAddrAscii[4], pcSockAddrAscii[5]);tSocketAddr.sa_data[3] = ascii_to_char(pcSockAddrAscii[6], pcSockAddrAscii[7]);tSocketAddr.sa_data[4] = ascii_to_char(pcSockAddrAscii[8], pcSockAddrAscii[9]);tSocketAddr.sa_data[5] = ascii_to_char(pcSockAddrAscii[10], pcSockAddrAscii[11]);sendto(ulSocket, pcData, ulDataLength, 0, &tSocketAddr, sizeof(sockaddr)); break;
出现的问题是:第一个发送出去的数据包网络调试助手都收不到,通过串口手动发送指令0405123451f90c0a80165
TCP发送数据时,要先发送一次UDP数据,CC3000才能建立和目标IP和端口的TCP server建立连接,然后数据能够发送成功。如果不先建立UDP连接的话,TCP的connect一直是blocking,直到timeout。
TCP发送数据的代码:
case UART_COMMAND_SEND_DATA_TCP:pcData = (char *)&usBuffer[4];ulDataLength = atoshort(usBuffer[2], usBuffer[3]);pcSockAddrAscii = (pcData + ulDataLength); // the family is always AF_INET//tSocketAddr.sa_family = atoshort(pcSockAddrAscii[0], pcSockAddrAscii[1]); tSocketAddr.sa_family =2; // the destination port tSocketAddr.sa_data[0] = ascii_to_char(pcSockAddrAscii[0], pcSockAddrAscii[1]);tSocketAddr.sa_data[1] = ascii_to_char(pcSockAddrAscii[2], pcSockAddrAscii[3]);// the destination porttSocketAddr.sa_data[2] = ascii_to_char(pcSockAddrAscii[4], pcSockAddrAscii[5]);tSocketAddr.sa_data[3] = ascii_to_char(pcSockAddrAscii[6], pcSockAddrAscii[7]);tSocketAddr.sa_data[4] = ascii_to_char(pcSockAddrAscii[8], pcSockAddrAscii[9]);tSocketAddr.sa_data[5] = ascii_to_char(pcSockAddrAscii[10], pcSockAddrAscii[11]); ulSocket = socket(2,1,6); //TCP connect blocking returen 0 is success if(connect(ulSocket,&tSocketAddr,sizeof(sockaddr))==0) send(ulSocket,pcData,ulDataLength,0); else { printf("Connect tcp service failed!\n\r"); closesocket(ulSocket); ulSocket = socket(2,1,6); connect(ulSocket,&tSocketAddr,sizeof(sockaddr)); send(ulSocket,pcData,ulDataLength,0);}
个人觉得不是杜邦线的问题了,因为CC3000已经能够初始化,且连接上AP了。
你电脑的防火墙有没有挡包?