基本的时间服务器和客户端构建。
服务器代码:
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <stdlib.h>
#define MAXLINE (4096)
#define LISTENQ (1024)
int
main(int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = 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(13);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror("bind error");
exit(1);
}
if (listen(listenfd, LISTENQ) == -1) {
perror("listen error");
exit(2);
}
printf("time server start working!\n");
while (1) {
if ((connfd = accept(listenfd, (struct sockaddr *)NULL, NULL)) == -1) {
perror("accept error");
exit(3);
}
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
if (write(connfd, buff, strlen(buff)) == -1) {
perror("write error");
exit(4);
}
close(connfd);
}
}
运行服务器:
$ sudo ./daytimetcpsrv
time server start working!
客户端代码:
#include <sys/types.h> // socket
#include <sys/socket.h> // socket
#include <stdio.h> // printf
#include <stdlib.h> // exit
#include <string.h> // bzero
#include <arpa/inet.h> // htons, inet_pton
#define MAXLINE (4096)
int
main(int argc, char *argv[])
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2) {
fprintf(stderr, "usage: a.out <IPaddress>\n");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket error");
exit(2);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
fprintf(stderr, "inet_pton error for %s\n", argv[1]);
exit(3);
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connect error");
exit(4);
}
while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = '\0';
if (fputs(recvline, stdout) == EOF) {
fprintf(stderr, "fputs error\n");
exit(5);
}
}
if (n < 0) {
perror("read error\n");
exit(6);
}
exit(0);
}
运行客户端:
$ ./daytimetcpcli 127.0.0.1
Tue Jun 25 11:52:54 2013