Hi frenz,
I wrote a client program in redflag in C language. I have to communicate with the server which is running in windows platform whose IP is 192.168.1.8. after executing the program sending message to server is success, but i am unable to receive complete message. my client program is as follows. pls find the bug in it.
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <malloc.h>
#define BUFFSIZE 5000
#define NO_MESSAGES 18
char* send_buffer[NO_MESSAGES]= {"<?xml version ='1.0'?><Vigyan><message>Systeminfo</message></Vigyan>","<?xml version='1.0'
?><Vigyan><message>Setpowersettings</message></Vigyan>","<?xml version='1.0' ?><Vigyan><message>BatteryInformation</message>
</Vigyan>","<?xml version ='1.0'?><Vigyan><message>Currenthostsettings</message></Vigyan>","<?xml version ='1.0'?><Vigyan><m
essage>PowerSchemes</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>Currentpowersettings</message></Vigyan>","<?
xml version='1.0' ?><Vigyan><message>Getsystemstatus</message></Vigyan>","<?xml version='1.0' ?><Vigyan><message>DeleteSchem
e</message></Vigyan>","<?xml version='1.0' ?><Vigyan><message>CreateScheme</message></Vigyan>","<?xml version ='1.0'?><Vigya
n><message>Hibernate</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>ShutDown</message></Vigyan>","<?xml version
='1.0'?><Vigyan><message>StandBy</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>Restart</message></Vigyan>","<
?xml version ='1.0'?><Vigyan><message>Logoff</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>Pause</message></Vi
gyan>","<?xml version ='1.0'?><Vigyan><message>PauseStatus</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>Resum
e</message></Vigyan>","<?xml version ='1.0'?><Vigyan><message>querysettings</message></Vigyan>"};
void Die(char *mess)
{
perror(mess);
}
char* timestamp()
{
struct tm* current;
time_t ltime;
char* time_now;
ltime = time(NULL);
time_now = asctime(localtime(<ime));
return time_now;
}
int main(int argc, char *argv[])
{
int sock,i;
FILE *fptr;
int length[NO_MESSAGES];
long h_length[NO_MESSAGES];
struct sockaddr_in server_addr;
char receive_buffer[BUFFSIZE];
int echolen;
int received = 0;
if (argc !=3 )
{
printf("Give IP and PORT as command line arguments \n");
exit(1);
}
//cteate a socket
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
Die("Failed to create socket");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(atoi(argv[2]));
if (connect(sock,(struct sockaddr *) &server_addr,sizeof(server_addr)) < 0)
{
Die("Failed to connect with server");
}
fptr = fopen("log.txt","w+");
if(fptr == NULL)
{
perror("fopen:");
exit(1);
}
fwrite("\tLOG FILE\n\nTIME\t\t\t\tMESSAGE RECEIVED\n", 36, 1, fptr);
int bytes = 0;
long receivedlength =0;
long h_receivelen;
for(i = 0; i < NO_MESSAGES; i++)
{
length[i] = strlen(send_buffer[i]);
h_length[i]= htonl(length[i]);
send(sock, (const char*)&h_length[i], 4, 0);
if (send(sock, send_buffer[i], length[i], 0) != length[i])
{
Die("Mismatch in number of sent bytes");
exit(1);
}
memset(receive_buffer, 0, sizeof(receive_buffer));
recv(sock, (char*)&receivedlength, 4, 0);
h_receivelen = ntohl(receivedlength);
char* recvbufptr = receive_buffer;
while(1)
{
bytes = recv(sock, recvbufptr, h_receivelen, 0);
char* time_now = timestamp();
printf("THE TIME IS >>>>>>%s\n", time_now);
fprintf(fptr,"%s\t%s\n",time_now ,send_buffer[i]);
if((bytes == 0) || (bytes == -1))
{
perror("recv:");
break;
}
if (bytes == h_receivelen)
{
break;
}
else
{
h_receivelen = h_receivelen - bytes;
recvbufptr = recvbufptr + bytes;
break;
}
}
receive_buffer[bytes] = '\0';
printf("\nRECIEVE BUFFER IS :%s\n", receive_buffer);
}//for
fseek(fptr, 0, SEEK_END);
int size_file = ftell(fptr);
rewind(fptr);
char* str = (char*) malloc (sizeof(str));
if(str == NULL)
{
perror("malloc:");
exit(1);
}
int bytes_file = fread(str,1, size_file, fptr);
printf("%s%d\n", str,bytes_file);
fclose(fptr);
close(sock);
// free(str);
return 0;
} // main
output is
THE TIME IS >>>>>>Fri Jul 3 17:50:01 2009
recv:: Success
RECIEVE BUFFER IS :<
THE TIME IS >>>>>>Fri Jul 3 17:50:01 2009
recv:: illegal seek
RECIEVE BUFFER IS :s
require output is some xml messages of very large bytes, which wass stored in char array buffer in windows. this is iron core problem to my HR also.
pls if this info is not enough contact me at
hellohinaveen@gmail.com
one more information. It is exactly working when i communicate with the server wich is runnning in my system itself. got this point. sorry im weak in english.