Multiclient服务器使用fork()

我试图创build一个套接字编程服务器来处理多个客户端在同一时间使用fork()..但我无法正确实施它,我一直在尝试很长一段时间。 我面临的问题是1)地址绑定问题2)问题如何处理父进程和subprocess3)如何结束服务器程序即..返回到控制台我的程序为单个客户端服务器工作正常。这里是我的代码为多个客户端服务器。

#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; } 

这是简单的客户端程序

  #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; } 

有人可以告诉我我做错了什么,做什么是正确的方法..? 任何帮助将不胜感激…

你所遇到的主要问题是==具有比=更高的优先级,所以这一行:

 if(pid=fork()==-1) 

fork() == -1的结果赋值给pid ,这不是你想要的结果:当fork()成功的时候,在child parent都会成功。 你需要使用:

 if((pid = fork()) == -1) 

你也应该在fork()之后close(new)父项 – 子项现在拥有这个套接字。 如果要发送计数器的文本版本,则需要使用snprintf()将其转换为文本。 在完成之后,孩子也应该退出 – 在你的代码中最简单的方法是跳出循环。 经过这些更正之后,服务器中的内部循环如下所示:

 for(;;) { new = accept(sockid, (struct sockaddr *)&clientaddr, &len); if ((pid = fork()) == -1) { close(new); continue; } else if(pid > 0) { close(new); counter++; printf("here2\n"); continue; } else if(pid == 0) { char buf[100]; counter++; printf("here 1\n"); snprintf(buf, sizeof buf, "hi %d", counter); send(new, buf, strlen(buf), 0); close(new); break; } } 

试试这个可能会得到解决方案,

服务器程序:

 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <signal.h> #include <unistd.h> int main() { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(9734); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address,server_len); /* Create a connection queue, ignore child exit details and wait for clients. */ listen(server_sockfd, 5); signal(SIGCHLD, SIG_IGN); while(1) { char ch; printf("server waiting\n"); /* Accept connection. */ client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len); /* Fork to create a process for this client and perform a test to see whether we're the parent or the child. */ if(fork() == 0) { /* If we're the child, we can now read/write to the client on client_sockfd. The five second delay is just for this demonstration. */ read(client_sockfd, &ch, 1); sleep(5); ch++; write(client_sockfd, &ch, 1); close(client_sockfd); exit(0); } /* Otherwise, we must be the parent and our work for this client is finished. */ else { close(client_sockfd); } } } 

客户程序:

 #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<string.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> void main() { int sid; char s[10]={},s1[10]={}; struct sockaddr_in ssock,csock; sid=socket(AF_INET,SOCK_STREAM,0); ssock.sin_family=AF_INET; ssock.sin_addr.s_addr=inet_addr("127.0.0.1"); ssock.sin_port=htons(9734); connect(sid,(struct sockaddr *)&ssock,sizeof(ssock)); while(1) { printf("\n Enter the string:"); scanf("%s",s); write(sid,(void*)s,strlen(s)); if(strlen(s)==0) break; sleep(1); read(sid,(void*)s1,sizeof(s1)); printf("\n The received string is:%s\n",s1); } close(sid); } 

这里的代码只做一个字符的通信。