Dear Ti,
I made MCU as a TCP server and it works well , allow in client to connect & data transfer. when data transfer is working, during which i am disconnecting client from server. If want to connect again then Client gives error in connection to server, while ping works attaching part of function here for reconnection of client.
I want reconnection to be happen in this part of code.
if(status==0 || connection_Stat==0)
{
// clientfd=0;
clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen);
}
Void tcpHandler(UArg arg0, UArg arg1)
{
int status;
struct sockaddr_in localAddr;
struct sockaddr_in clientAddr;
int optval;
int optlen = sizeof(optval);
socklen_t addrlen = sizeof(clientAddr);
//Task_Handle taskHandle;
//Task_Params taskParams;
//Error_Block eb;
server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (server == -1)
{
System_printf("Error: socket not created.\n");
goto shutdown;
}
memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
localAddr.sin_port = htons(arg0);
status = bind(server, (struct sockaddr *)&localAddr, sizeof(localAddr));
if (status == -1) {
System_printf("Error: bind failed.\n");
goto shutdown;
}
status = listen(server, NUMTCPWORKERS);
if (status == -1) {
System_printf("Error: listen failed.\n");
goto shutdown;
}
optval = 1;
if (setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
System_printf("Error: setsockopt failed\n");
goto shutdown;
}
// Current_init();
while ((clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen)) != -1)
{
connection_Stat=1;
lcd_clear();
HAL_Delay(2000);
lcd_put_cur(0, 0);
lcd_send_string("Remote Mode");
if(LC_RMT_PIN)
{
MODE=LOCAL;
}
while(1)
{
if(MODE==LOCAL)
{
Local_Mode_operation();
lcd_clear();
lcd_put_cur(0, 0);
lcd_send_string("Remote Mode");
HAL_Delay(2000);
}
while(MODE==REMOTE)
{
status = checkLinkState();
if(status==0 || connection_Stat==0)
{
// clientfd=0;
clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen);
}
else
{
uint8_t Eth_Buffer[129];
if(LC_RMT_PIN)
{
lcd_clear();
HAL_Delay(10);
lcd_put_cur(0, 0);
lcd_send_string("Local Mode");
HAL_Delay(5000);
lcd_clear();
MODE=LOCAL;
break;
}
//recv(lSocket,(char *)rcvd_data,10, MSG_DONTWAIT);
recv(clientfd,(char *)rcvd_data,10, MSG_DONTWAIT);
if(rcvd_data[0]=='C')
{
channel_no=((rcvd_data[1]-48)*10 + (rcvd_data[2]-48));
float val = ((rcvd_data[4]-48)*1000);
val += (rcvd_data[6]-48)*100;
val += (rcvd_data[7]-48)*10;
val += (rcvd_data[8]-48);
Set_point[channel_no]=val/1000;
memset(rcvd_data,0x00,sizeof(rcvd_data));
}
Eth_Buffer[0]=0x2A;
for(uint8_t i=0;i<32;i++)
{
Mux_1_2_add(i);
// HAL_Delay(10);
for(uint8_t j=0;j<5;j++)
{
ADCSequenceDataGet(ADC0_BASE, 0, &ADCValues);
volt=(ADCValues*3.3/4096);
}
volt= volt*1000;
uint8_t t=i*4;
Eth_Buffer[t+1]=((int)volt >> 24) & 0xFF;
Eth_Buffer[t+2]=((int)volt >> 16) & 0xFF;
Eth_Buffer[t+3]=((int)volt >> 8) & 0xFF;
Eth_Buffer[t+4]=(int)volt & 0xFF;
}
//stat=send(lSocket, Eth_Buffer,sizeof(Eth_Buffer), 0 );
stat=send(clientfd, Eth_Buffer,sizeof(Eth_Buffer), 0 );
if(stat<0)
connection_Stat=0;
else
connection_Stat=1;
}
}
}
}
addrlen = sizeof(clientAddr);
goto restart;
System_printf("Error: accept failed.\n");
shutdown:
if (server > 0)
{
close(server);
}
}
Please help
Regards
Khodidas