here is sample program to get the month or year or time request from multiple client to server in server program, here i am not able to send "Fri Jan 11 11:59:51 2008" the full string from buffer in server program to client.only Fri alone read in the client.
SERVER program
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include <unistd.h>
#include <fcntl.h>
#include<sys/stat.h>
#include<time.h>
int main(int argc,char **argv) {
int len,ch=0;
int sockfd,newfd;
struct sockaddr_in servaddr,cliaddr;
char str[1000];
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
printf("cannot create socket");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=INADDR_ANY;
servaddr.sin_port=htons(7220);
if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
printf("Bind error");
listen(sockfd,5);
len=sizeof(cliaddr);
time_t current_time = time(NULL);
struct tm* local_time = localtime(¤t_time);
char *buff=asctime(local_time);
int leng=sizeof(buff);
//strcpy(buff,buff1);
printf("%d",leng);
printf("%s",buff);
int n=0;
while(1) {
newfd=accept(sockfd,(struct sockaddr*)&cliaddr,&len);
printf("request from client%d",n++);
n=write(newfd,buff,sizeof(buff));
//n=write(newfd,buff1+1,sizeof(buff1));
printf("message sent to client%d",n);
}
close(newfd);
close(sockfd);
}
CLIENT program
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv) {
int len;
int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
char str[7][100],st[3][100];
int d,m,choice=0;
char buff[1024],buff1[1024];
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sin_port=htons(7220);
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
bzero(&buff,sizeof(buff));
bzero(&buff1,sizeof(buff1));
n=read(sockfd,buff,sizeof(buff));
printf("hai");
puts(buff);
//puts(buff1);
/*strcpy(str[1],strtok(buff," "));
strcpy(str[2],strtok(NULL," "));
strcpy(str[0],strtok(NULL," "));
strcpy(str[4],strtok(NULL," "));
strcpy(str[3],strtok(NULL," "));
while(choice!=6) {
printf("\n\nMENU\n");
printf("1.DATE\n");
printf("2.DAY\n");
printf("3.MONTH\n");
printf("4.YEAR\n");
printf("5.TIME\n");
printf("6.EXIT\n");
printf("ENTER CHOICE\n");
scanf("%d",&choice);
switch(choice) {
case 1: printf("date %s",str[0]);
break;
case 2: printf("day %s",str[1]);
break;
case 3: printf("month %s",str[2]);
break;
case 4: printf("year %s",str[3]);
break;
case 5: printf("time %s",str[4]);
break;
}
}*/
close(sockfd);
return 0;
}
The problem is in the server code:
n=write(newfd,buff,sizeof(buff));
should be
n=write(newfd,buff,strlen(buff) + 1);
sizeof(buff)
will not return the length of buff
, but the size of its type. buff
is a pointer, so sizeof(buff)
will be equal to 4 (this is your case I guess) or 8, depending on your system.
If sizeof(buff) == 4
, you will send the first 4 characters of buff
, which will be 'Fri
' (notice the space, which is a character too).
strlen()
will return you the length of the string, and that's what you want.
EDIT: alk's comment is right : You can have some trouble with read
. See ZanLynx's comment on the question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With