初级会员
积分 51
金钱 51
注册时间 2019-4-26
在线时间 15 小时
5 金钱
我在STM32F407上搭建TCP客户端,打算让它连接PC上的服务器,但每次启动时connect一直不成功。于是我就打开PC上的cmd终端,ping下客户端,发现是通的,奇怪的现象就出现了:ping完客户端后,客户端马上就能connect上服务器了。。试了几次都是这样,郁闷,请问大家知道这是啥原因导致的?
客户端IP:192.168.11.77
服务端IP:192.168.11.37
服务端软件:串口调试助手上的网络服务器功能
客户端代码:
#include "tcp_client.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory>
#include <cmsis_os.h>
#include "FreeRTOSIPConfig.h"
#include "FreeRTOS_IP.h"
#include "FreeRTOS_Sockets.h"
#include "data/data.h"
#include "generate_protocol/search_protocol/search_protocol.h"
#include "protocol/message.h"
#include "protocol/protocol.h"
#include "protocol/node_id.h"
#include "package.h"
#define MAX_HEART_COUNT 5 //单位xReceiveTimeOut
struct freertos_sockaddr TcpServerAddress;
static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 2000 );
static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 1000 );
Socket_t xSocket;
Recivebuff recivebuffes;
TaskHandle_t TCPTest_TaskHandle;
int try_count = 0;
int heart_miss_count = 0;
// 连接函数
int TcpClientConnect(void)
{
int ret = 0;
// 每次连接之前逻辑清空接收数组
recivebuffes.length = 0;
// 填充目标端口和IP地址
Data* data = Data::GetInstance();
unsigned short port = data->GetPort();
TcpServerAddress.sin_port = FreeRTOS_htons(port);
TcpServerAddress.sin_addr = FreeRTOS_htonl(data->GetRemoteIP());
// 创建套接字
xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
configASSERT( xSocket != FREERTOS_INVALID_SOCKET );
// 设置超时
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) );
// 连接
ret = FreeRTOS_connect( xSocket, &TcpServerAddress, sizeof( TcpServerAddress ) );
return ret;
}
// 断开连接
void TcpClientDisconnect(void)
{
TickType_t xTimeOnEntering;
BaseType_t xReturned;
// 关闭连接
FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR );
// 检查连接是否断开
xTimeOnEntering = xTaskGetTickCount();
do
{
xReturned = FreeRTOS_recv( xSocket, recivebuffes.cRxBuffers, sizeof(recivebuffes.cRxBuffers), 0 );
if( xReturned < 0 )
{
break;
}
}
while( ( xTaskGetTickCount() - xTimeOnEntering ) < xReceiveTimeOut );
// 关闭套接字
FreeRTOS_closesocket( xSocket );
}
// 发送函数
int TcpClientSend(char *pSendBuff,uint32_t lBuffLen)
{
BaseType_t lTransmitted;
// 发送数据
lTransmitted = FreeRTOS_send(xSocket,pSendBuff,lBuffLen,0 );
//vTaskDelay(150 / portTICK_PERIOD_MS);
if(lTransmitted < 0)
{
return 0;
}
else
{
return 1;
}
}
// 接收函数
void TcpClientRecive(void)
{
BaseType_t lrecive;
// 接收数据
memset(recivebuffes.cRxBuffers, 0, sizeof(recivebuffes.cRxBuffers));
lrecive = FreeRTOS_recv(xSocket, recivebuffes.cRxBuffers, sizeof(recivebuffes.cRxBuffers), 0);
if(lrecive <= 0 )
recivebuffes.length = 0;
else
{
recivebuffes.length = lrecive;
}
}
void TcpClientThread(const void *parameter)
{
auto send_to_pc = [](const std::string& data) ->void
{
TcpClientSend((char *)data.c_str(), data.size());
};
do{
if(TcpClientConnect() == 0)
{
try_count = 0;
while(1)
{
vTaskDelay(2000 / portTICK_RATE_MS );
}
}
TcpClientDisconnect();
vTaskDelay(3000 / portTICK_RATE_MS );
}while(++try_count);
vTaskDelete(xTaskGetCurrentTaskHandle());
}
BaseType_t xReturned;
void Heart_Handler(const void *parameter)
{
while(1)
{
if(FreeRTOS_issocketconnected(xSocket))
{
memset(recivebuffes.cRxBuffers, 0, sizeof(recivebuffes.cRxBuffers));
xReturned = FreeRTOS_recv( xSocket, /* The socket being received from. */
recivebuffes.cRxBuffers, /* The buffer into which the received data will be written. */
sizeof(recivebuffes.cRxBuffers), /* The size of the buffer provided to receive the data. */
0 );
}
else
{
vTaskDelay( 1000 / portTICK_PERIOD_MS );
}
}
vTaskDelete(xTaskGetCurrentTaskHandle());
}
int CreateTcpThread(void)
{
osThreadDef(TcpTask, TcpClientThread, osPriorityNormal, 0, 1024);
osThreadCreate(osThread(TcpTask), (void*)0);
osThreadDef(HeartTask, Heart_Handler, osPriorityNormal, 0, 700);
osThreadCreate(osThread(HeartTask), (void*)0);
return 0;
}
复制代码
我来回答