主要利用fork事先创建若干个进程,并发处理多个客户端的连接,返回当前系统时间。具体代码如下:
server.c
# include <sys/types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <time.h>
# include <string.h>
# include <stdio.h>
# include <signal.h>
# include <errno.h>
# include <unistd.h>
#define BUFFLEN 1024
#define SERVER_PORT 3333
#define BACKLOG 5
#define PIDNUM 3
static void handle_connect(int serv_fd)
{
int client_fd;
struct sockaddr_in client_addr;
int len=sizeof(client_addr);
while(1)
{
if((client_fd=accept(serv_fd,(struct sockaddr*)&client_addr,&len))<0)
{
perror("accept");
exit(errno);
}
printf("accept Done,the process id=%d\n",getpid());
time_t now;
char buff[BUFFLEN]={0};
int n=0;
memset(buff,0,BUFFLEN);
n=recv(client_fd,buff,BUFFLEN,0);
if(n>0&&!strncmp(buff,"TIME",4))
{
memset(buff,0,BUFFLEN);
now=time(NULL);
sprintf(buff,"%24s\r\n",ctime(&now));
send(client_fd,buff,strlen(buff),0);
}
close(client_fd);
}
}
void sig_int(int num)
{
exit(1);
}
int main(int argc, char* argv[])
{
int servfd;
unsigned int lisnum=3;
struct sockaddr_in serv_addr;
signal(SIGINT,sig_int);
servfd=socket(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERVER_PORT);
int err=bind(servfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(listen(servfd,lisnum) == -1){
perror("listen");
exit(errno);
}else
printf("the server is listening!\n");
pid_t pid[PIDNUM];
int i=0;
for(i=0;i<PIDNUM;i++)
{
pid[i]=fork();
if(pid[i]==0)
{
handle_connect(servfd);
}
}
while(1);
close(servfd);
return 0;
}
client.c
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<time.h>
#include<string.h>
#include<stdio.h>
#include<errno.h>
#define BUFFLEN 1024
#define SERVER_PORT 3333
int main(int argc,char*argv[])
{
int clientfd;
struct sockaddr_in serv_addr;
time_t now;
char buff[BUFFLEN]={0};
int n=0,err;
clientfd=socket(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERVER_PORT);
if((err=connect(clientfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)))<0) {
perror("connect");
exit(errno);
}
printf("Connected Done!!\n");
memset(buff,0,BUFFLEN);
strcpy(buff,"TIME");
send(clientfd,buff,strlen(buff),0);
memset(buff,0,BUFFLEN);
n=recv(clientfd,buff,BUFFLEN,0);
if(n>0)
{
printf("TIME:%s\n",buff);
}
close(clientfd);
return 0;
}