20175327 第八周课堂测验补交
基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
服务器响应消息格式是
“
客户端IP:XXXX
服务器实现者学号:XXXXXXXX
当前时间: XX:XX:XX
”
上方提交代码
提交一个客户端至少查询三次时间的截图测试截图
提交至少两个客户端查询时间的截图测试截图
- 在基于socket编程的基础上,以下为服务端代码部分
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<errno.h>
#include <time.h>
#define SERV_PORT 13327
int std_err(const char* name)
{
perror(name);
exit(1);
}
int main(void)
{
int sfd, cfd, ret;
int len;
pid_t pid;
socklen_t clie_len;
char buf[BUFSIZ], clibuf[32];
//创建服务器套节字
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd == -1)
std_err("socket");
//定义地址类型
struct sockaddr_in serv_addr, clie_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定服务器的IP、端口;
ret = bind(sfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if(ret == -1)
std_err("bind");
//监听链接服务器的客户数量
ret = listen(sfd, 3);
if(ret == -1)
std_err("listen");
clie_len = sizeof(clie_addr);
while(1)
{
//阻塞等待客户端发起链接请求
cfd = accept(sfd, (struct sockaddr*)&clie_addr, &clie_len);
printf("服务器实现者20175327 ");
printf("客户端IP:%s
",inet_ntoa(clie_addr.sin_addr));
time_t t = time(0);
char tmp[64];
strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A
", localtime(&t) );
//这里无需打印当前时间,应该是客户端打印当前时间
if(cfd == -1)
std_err("accept");
pid = fork();
if(pid < 0)
std_err("fork:");
else if(pid == 0)
{
close(sfd);
break;
}
else //1.回收子进程,2,关闭不必要的文件描述父 3,继续等待客户端链接,如果有,则继续创建子进程
{
send(cfd,tmp,strlen(tmp),0);
close(cfd);
}
}
return 0;
}
- 在基于socket编程的基础上,以下为客户端代码部分
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/wait.h>
#include<signal.h>
#include<errno.h>
#include<pthread.h>
#define SERV_PORT 13327
#define SERV_IP "127.0.0.1"
#define NUM 3
int std_err(const char* name)
{
perror(name);
exit(1);
}
int main(void)
{
int cfd, ret;
char buf[BUFSIZ];
pid_t pid;
int i;
for(i = 0; i < NUM; i++){
pid = fork();
if(pid == 0)
break;
else if(pid < 0)
std_err("fork");
}
//子进程逻辑
if(pid == 0)
{
//创建套节字
cfd = socket(AF_INET, SOCK_STREAM, 0);
if(cfd == -1)
std_err("socket");
//定义IP , 端口
struct sockaddr_in clie_addr;
clie_addr.sin_family = AF_INET;
clie_addr.sin_port = htons(SERV_PORT);
//转换IP 字符串的地址
ret = inet_pton(AF_INET, SERV_IP, &clie_addr.sin_addr.s_addr);
if(ret != 1)
std_err("inet_pton");
//链接服务器
ret = connect(cfd, (struct sockaddr*)&clie_addr, sizeof(clie_addr));
if(ret == -1)
std_err("connect");
char buff[256];
int nRecv=recv(cfd,buff,256,0);
if(nRecv>0)
{
buff[nRecv]=' ';
printf("当前时间:%s
",buff);
}
}
//关闭套节字
close(cfd);
return 0;
}
- 实验结果截图: