简单的迭代方式
在此种方式中,服务器端通过循环,监控客户端的连接,当一个客户端连接致服务器时,服务器从阻塞中返回,并执行客户端请求处理函数,当请求处理函数执行完成后,再进入循环,等待下一个客户的连接。此种模式非常的简单,但是有一个最大的缺点不能处理并发的请求,同一时刻只能处理一个连接,当处理完成时,才能处理下一个请求。如果对并发没有要求,而且服务器处理一次请求占用很少的CPU时间的时候,这种方式还是比较实用的,例如下面的例子中的,时间服务器等。
例子,用迭代方式实现时间服务器
实现功能,当客户端发送请求时,服务器返回当前时间。
此代码在AIX5.2中编译通过。
服务器代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAXLINE 1024
#define LISTENQ 4
/* 请求处理函数 */
void requestProcess(int fd) {
char buff[MAXLINE];
time_t ticks;
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(fd, buff, strlen(buff));
return;
}
int main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(2003);
bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
listen(listenfd, LISTENQ);
for(;;) {
connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
/* 执行请求处理函数 */
requestProcess(connfd);
close(connfd);
}
}