I am trying to create a socket programming server to handle multiple clients at the same time using fork()..
But I am not able to implement it properly.I have been trying for a long time .
The problems I am facing are
1) address bind problem
2) problem how to handle parent process and child process
3) how to end the server program ie ..return to the console
My programs for a single client server were working properly.Here is my code for the multiple client-server.
#include<signal.h>
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
int main()
{
struct sockaddr_in myaddr ,clientaddr;
int sockid,newsockid;
sockid=socket(AF_INET,SOCK_STREAM,0);
memset(&myaddr,'0',sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(sockid==-1)
{
perror("socket");
}
int len=sizeof(myaddr);
if(bind(sockid,( struct sockaddr*)&myaddr,len)==-1)
{
perror("bind");
}
if(listen(sockid,10)==-1)
{
perror("listen");
}
int pid,new;
static int counter=0;
for(;;)
{ a:
new =accept(sockid,(struct sockaddr *)&clientaddr,&len);
if(pid=fork()==-1)
{
close(new);
continue;
}
else if(pid>0)
{
counter++;
//wait();
goto a;
printf("here2");
//close(new);
continue;
}
else if(pid==0)
{
counter++;
printf("here 1");
send(new,"hi",100,0);
send(new,(char *) &counter,1,0);
//kill(pid,SIGKILL);
//close(new);
}
}
printf("here3");
close(sockid);
return 0;
}
Here is the simple client program
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<sys/types.h>
int main()
{
struct sockaddr_in myaddr ,serveraddr;
int sockid;
sockid=socket(AF_INET,SOCK_STREAM,0);
memset(&myaddr,'0',sizeof(myaddr));
myaddr.sin_family=AF_INET;
myaddr.sin_port=htons(8888);
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(sockid==-1)
{
perror("socket");
}
int len=sizeof(myaddr);
if(connect(sockid,(const struct sockaddr*)&myaddr,len)==-1)
{
perror("connect");
}
fprintf(stdout,"Client Online....");
char s[10000];
//gets(s);
//send(sockid,s,10000,0);
recv(sockid,&s,10000,0);
fprintf(stdout,"Server says....");
puts(s);
recv(sockid,&s,10000,0);
fprintf(stdout,"Server says....");
puts(s);
sleep(10);
close(sockid);
return 0;
}
Can someone please tell me what I am doing wrong and what is the correct way to do it..? Any help will be greatly appreciated…
The main problem you have is that
==has higher precedence than=, so this line:is assigning the result of
fork() == -1topid, which isn’t what you want: it’ll always be0whenfork()succeeds, in both the child and the parent. You need to use:You should also
close(new)in the parent after thefork()– the child owns that socket now. If you want to send the textual version of the counter, you need to usesnprintf()to convert it to text. The child should also exit after it’s finished – the easiest way to do that in your code is to break out of the loop. After these corrections, the inner loop in your server looks like: