通过客户端访问服务器获取服务器当前时间的程序初步了解UNIX网络编程套接字。
客户端代码如下
#include "unp.h"
#define MAXLENE 1024
void err_quit(const char* str, ...);
void err_sys(const char* str, ...);
int main(int argc, char **argv){
int sockfd, n;
char recvline[MAXLENE + 1];
struct sockaddr_in serveraddr;
if(argc != 2)
err_quit("Usage: a.out <IPaddress>");
//创建套接字
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
err_sys("socket error");
//结构体全部赋值为null
bzero(&serveraddr, sizeof(serveraddr));
//协议类型
serveraddr.sin_family = AF_INET;
//服务器端口
serveraddr.sin_port = htons(13); /* daytime server */
//服务器IP地址赋值,主要将十分制的IP地址转化
if(inet_pton(AF_INET, argv[1], &serveraddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
//与服务器建立连接
if(connect(sockfd, (SA *)&serveraddr, sizeof(serveraddr)) < 0)
err_sys("connect error");
else
printf("connect successfully\n");
//获取服务的消息,并进行标准输出,然后退出
while((n = read(sockfd, recvline, MAXLENE)) >0){
recvline[n] = 0; /* null terminate */
if(fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
//关闭套接字
close(sockfd);
printf("exit after data received\n");
exit(0);
}
void err_quit(const char* str, ...){
printf("%s\n", str);
exit(0);
}
void err_sys(const char* str, ...){
printf("%s\n", str);
exit(0);
}
服务端代码:
/*
* Time server
*
*/
#include "unp.h"
#include <time.h>
#define MAXLENE 1024
#define LISTENQ 1024
int main(int argc, char** argv){
int listenfd, connfd;
struct sockaddr_in serveraddr;
char buf[MAXLENE];
time_t ticks;
/* step 1: create socket */
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0){
printf("socket error\n");
return -1;
}
/* step 2: bind socket*/
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(13); /* daytime server */
int n = bind(listenfd, &serveraddr, sizeof(serveraddr));
if(n < 0){
printf("bind error\n");
return -1;
}
//监听
n = listen(listenfd,LISTENQ);
if(n <0){
printf("listen error, error number is %d\n",n);
return -2;
}
for(;;){
//接受套接字
connfd = accept(listenfd,NULL, NULL);
ticks = time(NULL);
snprintf(buf, sizeof(buf),"%.24s\r\n", ctime(&ticks));
//向连接的客户端发送消息
n = send(connfd, buf, MAXLENE,MSG_CONFIRM);
//关闭客户端
close(connfd);
}
}