TI中文支持网
TI专业的中文技术问题搜集分享网站

TCP的connect 一直阻塞,要在udp发送数据以后,才能connect成功?求解

   用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  UDPelse if(linktype==2)
ulSocket = socket(2,1,6);//AF_Init SOCK_STREAM TCPelseulSocket = 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 port
			tSocketAddr.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 port
			tSocketAddr.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 successif(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了。



Yonghua Pan:

你电脑的防火墙有没有挡包?

赞(0)
未经允许不得转载:TI中文支持网 » TCP的connect 一直阻塞,要在udp发送数据以后,才能connect成功?求解
分享到: 更多 (0)