多进程实现多用户连接,即每个用户一个连接,这里仍然用server将收到的字符串转大写后返回给客户端。
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/wait.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 8000
void wait_child(int signo)
{
while(waitpid(0, NULL, WNOHANG)>0);
return;
}
int main(int argc,char *argv[])
{
pid_t pid;
int sfd, cfd;
struct sockaddr_in serv_addr, clie_addr;
socklen_t clie_addr_len;
char buf[BUFSIZ], clie_IP[BUFSIZ];
int n , i;
sfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_PORT);
bind(sfd, (struct sockaddr * )&serv_addr, sizeof(serv_addr));
listen(sfd, 128);
while(1)
{
clie_addr_len = sizeof(clie_addr);
cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len);
printf("client IP:%s, port:%d\n", inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), ntohs(clie_addr.sin_port));
pid = fork();
if(pid< 0)
{
perror("fork error");
exit(1);
}
else if(pid == 0)
{
close(sfd);
break;
}
else if(pid>0)
{
close(cfd);
signal(SIGCHLD, wait_child);
}
}
if(pid == 0)
{
while(1)
{
n = read(cfd, buf, sizeof(buf));
if(n == 0)
{
close(cfd);
return 0;
}
else if(n == -1)
{
perror("read error");
exit(1);
}
else
{
write(STDOUT_FILENO, buf, n);
for(i= 0; i< n;++i)
{
buf[i] = toupper(buf[i]);
}
write(cfd, buf, n);
}
}
}
return 0;
}