Read function some times cause time out if time 1 or time 1000 although the server work well and get data in small time in command line
is the read function get all data in all cases or not
(unix aix)
#include"TCPClient.h"
#include<fcntl.h>
#include<string>
using namespace std;
TCPClient::TCPClient()
{
signal(SIGPIPE,SIG_IGN);
Socket = -1;
}
TCPClient::~TCPClient()
{
printf("\n tcp destroy \n");
}
int TCPClient::Init()
{
printf("\n init \n ");
Socket = socket(AF_INET,SOCK_STREAM,0);
int flag = 1;
if(Socket < 0)
{
printf(" \n fails create socket \n");
return -1;
}
memset(&data_socket,0,sizeof(data_socket));
return 1;
}
int TCPClient::Read(char* data,int len ,int timeout , char * delem,int delm_len,int &r)
{
int l;
timeval t_out;
fd_set set;
if(timeout<20)
t_out.tv_sec = timeout;
else
t_out.tv_sec = 35;
t_out.tv_usec = 0;
FD_ZERO(&set);
FD_SET(Socket,&set);
l = select(Socket +1, &set, NULL, NULL, &t_out);
setsockopt(Socket,SOL_SOCKET|SO_LINGER,SO_RCVTIMEO,(char*)&t_out,sizeof(struct timeval));
if(l==0)
{
printf("\n time out %i \n",timeout);
return -10;
}
else if(len<0)
{
printf("\n error in select 2 TCPClient \n");
return -5;
}
char a[1] = {0};
memset(data,0,sizeof(data));
ssize_t l1;
int i = 0;
int cycle = 0;
while(true)
{
l1 = recv(Socket,a,1,0);
if(l1==0)
{
printf("\n closed \n");
i = 0;
break;
}
data = stpcpy(data,a);
if(l1 == -1)
{
cycle++;
if(r==5 && cycle<6)
{
sleep(1);
printf("wait");
continue;
}
break;
}
i +=l1;
if(delm_len>1 && strstr(data,delem)!=NULL)
{
printf("\n hit strstr \n ");
break;
}
else if(delm_len==1 && delem[0]==a[0])
{
r = 1;
break;
}
if(i>=len && r==1)
break;
} return i;
}
int TCPClient::Connect(char*address ,int port)
{
Init();
Bind();
data_socket.sin_addr.s_addr = inet_addr( address );
data_socket.sin_family = AF_INET;
data_socket.sin_port = htons(port);
int io_f = 0;
timeval t_out;
t_out.tv_sec = 3;
t_out.tv_usec = 0;
setsockopt(Socket,SOL_SOCKET,TCP_NODELAY|SO_REUSEADDR,(char*)&t_out,sizeof(struct timeval));
ioctl(Socket, FIONREAD, &io_f);
printf("\n Icotol \n");
if(connect(Socket,(struct sockaddr*)&data_socket,sizeof(data_socket))<0)
{
printf("Can't connect to %s ",address);
return -1;
}
return 1;
}
int TCPClient::Bind()
{
server.sin_addr.s_addr = INADDR_ANY;
server.sin_family = AF_INET;
server.sin_port = htons(0);
int flag = 1;
setsockopt(this->Socket,IPPROTO_TCP,SO_REUSEADDR,(char*)&flag,sizeof(int));
if(bind(Socket,(struct sockaddr*)&server,sizeof(server))!=0)
{
printf("%s\n","failed bind Socket");
return -1;
}
sockaddr_in localaddress;
unsigned long addrlen = sizeof(localaddress);
int rc = getsockname(Socket,(struct sockaddr *)&localaddress, &addrlen);
return 1;
}
void TCPClient::Disconnect()
{
printf(" \n Disconnect() \n");
shutdown(Socket,SHUT_RDWR);
close(Socket);
}