下面代码实现的是典型的迭代服务器框架,服务器端功能是为客户端提供日期服务。
(1) 服务器端代码
dayserv.c源代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include <unistd.h>
#define MAX_BUFFER 128
#define DAYTIME_SERVER_PORT 8001
int main ( void )
{
int serverFd, connectionFd;
struct sockaddr_in servaddr;
char timebuffer[MAX_BUFFER+1];
time_t currentTime;
serverFd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
bind(serverFd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(serverFd, 5);
while ( 1 ) {
connectionFd = accept(serverFd, (struct sockaddr *)NULL, NULL);
if (connectionFd >= 0) {
currentTime = time(NULL);
snprintf(timebuffer, MAX_BUFFER, "%s\n", ctime(¤tTime));
write(connectionFd, timebuffer, strlen(timebuffer));
close(connectionFd);
}
}
return 0 ;
}
(2)客户端代码
daycli.c源代码如下:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define MAX_BUFFER 128
#define DAYTIME_SERVER_PORT 8001
int main ( int argc, char *argv[] )
{
int connectionFd, in;
struct sockaddr_in servaddr;
char timebuffer[MAX_BUFFER+1];
if (argc != 2) {
fprintf(stderr, "Usage:./daycli IP\n") ;
return -1;
}
connectionFd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);
servaddr.sin_addr.s_addr = inet_addr(argv[1]) ;
connect(connectionFd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while ( (in = read(connectionFd, timebuffer, MAX_BUFFER)) > 0) {
timebuffer[in] = 0;
printf("\n%s", timebuffer);
}
close(connectionFd);
return 0;
}
(3)编译与执行
编译服务端代码 gcc dayserv.c -o dayserv。
编译客户端代码 gcc daycli.c -o daycli。
执行 ./dayserv &, ./daycli 127.0.0.1,执行结果如下:
Fri Jan 16 14:20:21 2009
摘录自《深入浅出Linux工具与编程》