在之前的TCP服务器设计时,采用的是循环接收并处理客户机的请求的轮询方式,这样的效率太低,因为当多个客户机同时向服务器发出请求时,就会导致后面来的客户机一直停滞在那里,直到服务器处理完前一个客户机的请求之后才会处理下一个服务器的请求。
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[128];
int nbyte;
int sin_size;
int pid;
//创建socket
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("create socket error\n");
exit(1);
}
//设置要绑定的地址
bzero(&server_addr, sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定地址
bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr_in));
//监听端口
listen(sockfd, 5);;
while(1)
{
//等待连接
sin_size = sizeof(struct sockaddr);
new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size);
printf("server get connect from %s\n", inet_ntoa(client_addr.sin_addr));
//创建子进程,由子进程处理数据通讯
if(pid = fork() == 0)
{
nbyte = recv(new_fd, buffer, 128, 0);
buffer[nbyte] = '\0';
printf("server received %s \n", buffer);
close(new_fd);
close(sockfd);
exit(0);
}
else if(pid < 0)
printf("fork error!\n");
//结束连接
}
close(sockfd);
return 0;
所以一个较好的办法就是采用多进程来处理。利用主进程来接受客户机的请求,得到一个请求就创建一个子进程来处理数据,这样就可以在同一时刻处理多个客户机发来的请求。当然也可以用多线程。
#include
#include
#include
#include
#include
#define portnum 3333
int main()
{
//
close(new_fd);
}