Thread 中讨论的其他器件:SYSBIOS
尊敬的团队:
我正在编写一个函数、使用 TI-NDK (2.25.00.09)通过 TCP 发布 http 请求。 我能够成功地发布 HTTP 请求并在第一次返回响应。
在第二次迭代中,NDK_recv 返回带有错误代码的0 (54 -> 对等连接复位) 。 我一直在讨论如何处理这个问题。 在这种情况下,我再次尝试调用 NDK_Connect(),但它完全与另一组错误代码混淆。
如果我看到"对等连接重置"错误、您能不能帮助您了解正确的处理方式。 是否应该 为每个 http 请求关闭并重新创建完整的套接字?,或者是否有最佳的有效方法来处理此问题。 我在下面放置了我的代码
/******** 代码代码 /
#define ETHERNETHTTP_TXDATASIZE 512 //每次推送到服务器的最大数据大小
#define ETHERNETHTTP_RXDATASIZE 512 //每次从服务器提取的最大数据大小
int EthernetHTTPSendSocket =-1;
int EthernetHTTPRecvSocket =-1;
char EthernetHTTPSendData_1[ETHERNETHTTP_TXDATASIZE]="";
char EthernetHTTPRecvData_1[ETHERNETHTTP_RXDATASIZE]="";
struct sockaddr_in EthernetHTTPSocketAddr_1;
char EthernetHTTPSocket_Restorartrequired = true;//如果需要重新启动套接字、则将位设置为 true
uint32_t 通信 IP = 0x67546006;// www.evergreeninternet.in [103.84.96.6]
char 通信 IP_number[17]="103.84.96.6";
/*从 SYSBIOS 任务调度程序创建的任务。 未动态创建*/
void HTTP_SenddataServer_1_Task ()
{
内部返回值、错误;
结构时间值 TimeOutValue;
struct sockaddr_in EthernetHTTP_HOSTAddr;
HTTPRESPONSE_TYPE HttpResponse_Socket1;
int HndlSelfTask = TaskSelf();
int optval;
char ReconnectSocket = true;
memset (&EthernetHTTPSocketAddr_1、0、sizeof (EthernetHTTPSocketAddr_1));
memset (&EthernetHTTP_HOSTAddr、0、sizeof (EthernetHTTP_HOSTAddr));
EthernetHTTPSocketAddr_1_1.sin_family = AF_iNet;
EthernetHTTPSocketAddr_1_1.sin_addr.s_addr = htonl (INADDR_ANY);
EthernetHTTPSocketAddr_1_1.sin_port = htons (TcpPort_HTTP);
EthernetHTTP_HOSTAddr.SIN_family = AF_iNet;
EthernetHTTP_HOSTAddr.SIN_addr.s_addr = htonl (INADDR_ANY);//发送前动态更改主机地址
EthernetHTTP_HOSTAddr.SIN_PORT = htons (TcpPort_HTTP);
TimeOutValue.tv_sec = 10;//接收和发送超时(10秒)
TimeOutValue.tv_usec = 0;
while (1)
{
while (EthernetHTTPSocket _Restartrequired == true)
{
/*等待获取有效 IP */
while (Ethernet_ETHConnStatus.CurrentIP = 0) Task_sleep (1000);
/*如果已打开,请关闭套接字*/
if (EthernetHTTPSendSocket 1!=-1)
{
fdClose (EthernetHTTPSendSocket 1);
fdCloseSession (HndlSelfTask);
}
fdOpenSession (HndlSelfTask);
/*创建套接字*/
EthernetHTTPSendSocket 1 = NDK_socket (AF_iNet、SOCK_STREAM、IPPROTO_TCP);
if (EthernetHTTPSendSocket 1 =-1)
{
/*此处的错误处理*/
ERR = fdError();
}
/*绑定套接字*/
返回值= NDK_BIND (EthernetHTTPSendSocket _1、(struct sockaddr *)&EthernetHTTPSocketAddr_1、sizeof (EthernetHTTPSocketAddr_1));
IF (返回值=-1)
{
/*此处的错误处理*/
ERR = fdError();
}
/*设置套接字选项*/
返回值= NDK_setsockopt (EthernetHTTPSendSocket 1、SOL_Socket、SO_keepalive、&optval、sizeof (optval));
返回值= NDK_setsockopt (EthernetHTTPSendSocket _1、SOL_Socket、SO_SNDTIMEO、&TimeOutValue、sizeof (TimeOutValue));
返回值= NDK_setsockopt (EthernetHTTPSendSocket _1、SOL_Socket、SO_RCVTIMEO、&TimeOutValue、sizeof (TimeOutValue));
/*以太网重新启动完成*/
EthernetHTTPSocket 恢复所需= false;
ReconnectSocket flg = true;
}
/*重新连接套接字*/
if (reconnectSocket _flg =true)
{
EthernetHTTP_HOSTAddr.SIN_addr.s_addr = htonl (CommunicationIP);//设置目标主机
返回值= NDK_CONNECT (EthernetHTTPSendSocket _1、(struct sockaddr *)&EthernetHTTP_HOSTAddr、sizeof (EthernetHTTP_HOSTAddr));
IF (返回值=-1)
{
/*此处的错误处理*/
ERR = fdError();
如果(err =ECONNREFUSED || err =EHOSTDOWN || err =EHOSTUNREACH)
{
EthernetHTTPSocket 恢复= true;
}
否则、如果(err =EISCONN)
{
/*已建立连接->套接字已连接*/
ReconnectSocket flg = false;
}
}
其他
{
/*已建立连接*/
ReconnectSocket flg = false;
}
}
/ /
/******** 发送/接收数据到套接字********* /
/*等待数据就绪信号量*///完成//
HTTP_GetConstruct (CommunicationIP_number、"/"、EthernetHTTPSendData_1); //要测试的数据样本
返回值= NDK_SEND (EthernetHTTPSendSocket _1、EthernetHTTPSendData_1、strlen (EthernetHTTPSendData_1)、0);
IF (返回值=-1)
{
ERR = fdError();
if (err =ENOTCONN)/* 57 ->套接字未连接*/
{
ReconnectSocket flg = true;
}
}
其他
{
/* TX 成功、获取响应*/
返回值= NDK_recv (EthernetHTTPSendSocket _1、EthernetHTTPRecvData_1、ETHERNETHTTP_RXDATASIZE-1、0);
ERR = fdError();
if (err =ECONNRESET)/* 54 ->对等设备的连接复位*/
{
/*
*对 TI 的注释:在第二次发送 HTTP GET 时、while 循环的第二次干预在此结束
*
ReconnectSocket flg = true;
}
if (err =0){HTTP_ResponseDeconstruct (EthernetHTTPRecvData_1、&HttpResponse_Socket1);}
}
}
}
/*
*函数从数据创建 HTTP GET 请求
*
* data -> Raw Data to construct.(要构建的原始数据。
*数据长度->数据长度
* outputdat ->禁忌 HTTP GET 数据
*
*
void HTTP_GetConstruct (char* host、char* data、char* outputdat)
{
strcpy (outputdat、"get ");
strcat (outputdat、data);
strcat (outputdat、" HTTP/1.1");
strcat (outputdat、"\r\n 主机:");
strcat (outputdat、host);
strcat (outputdat、"\r\n 用户代理:HTTPCli (ARM;TI-RTOS)");
strcat (outputdat、"\r\n 连接:保持活动");
strcat (outputdat、"\r\n\r\n);
}
