i am trying socket programming in linux(fedora 7) using C language.
i want to send a buffer from server to client,and vice versa.
but the contents are not getting saved.the contents are unsigned long so i am converting them into ascii usinf sprintf and then saving in buffer.but its not getting saved.it shows that buffer is empty.please help me.

my attachin code.

SERVER SIDE:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>


#define MYPORT 3490



int main()
{
int result,result1;
int sockfd;


struct sockaddr_in my_addr;


char buffer[40];
char req_buffer[40];


sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
printf("Creating socket error\n");
//return -1;
}
printf("\n socket created\n");


my_addr.sin_family = AF_INET;          // host byte order
my_addr.sin_port = htons(MYPORT);      // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY;  // automatically fill with my IP
memset(&(my_addr.sin_zero), '\0', 8);


printf("\nsdsd\n");



if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
printf("\n bind successfull\n");


if (listen(sockfd,15) == -1)
{
perror("listen");
exit(1);
}
printf("\n listen successfull\n");


struct sockaddr_in hisaddr;
int acceptfd;
socklen_t addrlen;



while (1)
{


acceptfd = accept(sockfd,(struct sockaddr *)&hisaddr, &addrlen);
if(acceptfd < 0)
{
printf("Error accepting on the socket %d\n");
continue;
}
printf("%s: Accepted Connection\n");


unsigned long p,g,SA,SB,TA,TB;


p=32;
sprintf(buffer[0],"%d",p);


q=4
sprintf(buffer[1],"%d",g);


TA=100;
sprintf(buffer[2],"%d",TA);



result1 = send(acceptfd, buffer,14, 0);



if(result<0)
{
printf("\n error while sending from serv-cli");
}
printf("\n send success from serv-cli");*/


result1 = recv(acceptfd, req_buffer, 1024, 0);
if(result1 < 0)
{
printf("Error reading on the socket %d\n");


continue;
}
req_buffer[result1] = '\0';
printf("\nReceived: %s\n",req_buffer);


close(acceptfd);


}
close(sockfd);
return 0;
}

CILENT SIDE

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netdb.h>


#define SERV_PORT 3490



int main(int argc,char *argv[])
{
int servsock,result,receive;
char buffer[40];


struct sockaddr_in servaddr;
struct hostent *he;



if (argc != 2)
{
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) // get the host info
{
herror("gethostbyname");
exit(1);
}


servsock = socket(AF_INET, SOCK_STREAM, 0);
if(servsock < 0)
{
printf("Error creating socket connecting to server\n");


}


servaddr.sin_family = AF_INET;
servaddr.sin_addr = *((struct in_addr *)he->h_addr);
servaddr.sin_port = htons(SERV_PORT);


memset(&(servaddr.sin_zero), '\0',8);


result = connect(servsock, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(result < 0) {
printf("Error connecting to server \n");
}



char buf[40];
unsigned long p,g,SA,SB,TA,TB;
int numbytes,i=0;
while(1)
{
if ((numbytes=recv(servsock, buf, 14, 0)) == -1)
{
perror("recv");
exit(1);
}
buf[numbytes] = '\0';


printf("\n Received: %s\n",buf);
printf("numbytes= %d",numbytes);



sscanf(buf[0],"%ld",&p);
sscanf(buf[1],"%ld",&g);
sscanf(buf[2],"%ld",&TA);



printf("p: %d\n g: %d\n TA: %d\n",p,g,TA);



printf("enter data to send");
scanf("%s",buffer);
result = send(servsock, buffer, 14, 0);
if(result<0)
{
printf("\n error while sending from cli-serv");
}
printf("\n send success from cli-serv");


}
close(servsock);


return 0;
}

I Think

char buffer[40];

I See

p=32;
sprintf(buffer[0],"%d",p);

q=4
sprintf(buffer[1],"%d",g);

TA=100;
sprintf(buffer[2],"%d",TA);

Your Problem

You've set buffer as an array of characters with length 40 and then you're trying to sprint multiple long integers to different parts of that buffer which probably won't work too well.

try with one variable to begin with sprintf(buffer,"%d",p); if that works then try something like this sprintf(buffer,"%d,%d,%d",p,q,TA); you're only sending 14 bytes in your send call. better would be this: result1 = send(acceptfd, buffer,strlen(buffer), 0); you'll have to modify your recv as well, you'll want to grab x bytes at a time until there is no more data left on the socket.

Also; format your code. it's much easier to read and follow program flow if it's formatted properly.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.