2017-2018-1 20155320第八周课堂实践总结+课下作业
第八周测试-1和第八周测试-2课上已经交了
第八周测试-3
基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
服务器响应消息格式是
“
客户端IP:XXXX
服务器实现者学号:XXXXXXXX
当前时间: XX:XX:XX
”
上方提交代码
提交一个客户端至少查询三次时间的截图测试截图
提交至少两个客户端查询时间的截图测试截图
- 在网上找了代码修改后实现,ps:根据学号5320计算得到端口号为333
出现的问题和解决过程
-
在编译时出现如下情况
-
这是由于csapp.c 未被导入导致的,但是之前我已经将cssap.c和csapp.h导入到了include文件夹和lib文件夹下。为了解决这个问题,我将csapp.c已入客户端和服务器的代码所在的文件夹下,在编译时时将csapp.c一起编译就可以了。
第八周课下作业1
1 完成家庭作业4.47,4.48,4.49
2 相应代码反汇编成X86-64汇编
3 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码
发操作过程、测试、问题解决过程博客链接
- 家庭作业4,47
取指阶段:icode=ifun<--MI[PC]=D:0
valP<=PC+1;下一条指令地址
译码阶段:valE<=R[%ebp];得到ebp的值,即新的栈指针esp的值
执行阶段: valE<=valB+4;栈指针的值+4
访存阶段:valM<=M4[valB];读ebp中的值
写回阶段:R[%esp]<=valE;把更新后的指针赋值给esp
R[%ebp]<=valM;弹出的ebp的值
- 家庭作业4.48
取值阶段:icode:ifun=MI[PC]=C:0;
rA:rB<-[PC+1]
valC<-M4[PC+2]
valP<-PC+6
译码阶段:valB<-R[rB]
执行阶段:valE<-valB+valC
SetCC
访存阶段
写回阶段 R[r8]<-valE
第八周课下作业2(课上没完成的必做)
把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试
提交博客链接
client.c (没有变)
/*
* echoclient.c - An echo client
*/
/* $begin echoclientmain */
#include "csapp.h"
int main(int argc, char **argv)
{
int clientfd, port;
char *host, buf[MAXLINE];
rio_t rio;
if (argc != 3) {
fprintf(stderr, "usage: %s <host> <port>
", argv[0]);
exit(0);
}
host = argv[1];
port = atoi(argv[2]);
clientfd = Open_clientfd(host, port);
Rio_readinitb(&rio, clientfd);
while (Fgets(buf, MAXLINE, stdin) != NULL) {
time_t t;
struct tm * lt;
size_t n;
printf("
客户端IP:127.0.0.1
");
printf("服务器实现者学号:20155320
");
time (&t);//获取Unix时间戳
lt = localtime (&t);//转为时间结构
printf ("当前时间为:%d/%d/%d %d:%d:%d
",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。注意月份取值区间为[0,11],所以要+1;年份的修改。
Rio_writen(clientfd, buf, strlen(buf));
Rio_readlineb(&rio, buf, MAXLINE);
Fputs(buf, stdout);
}
Close(clientfd); //line:netp:echoclient:close
exit(0);
}
/* $end echoclientmain */
-多进程实现
只需要修改server的代码
server3.c代码:
#include "csapp.h"
void echo(int connfd,char *haddrp);
void sigchld_handler(int sig) //line:conc:echoserverp:handlerstart
{
while (waitpid(-1, 0, WNOHANG) > 0)
;
return;
} //line:conc:echoserverp:handlerend
int main(int argc, char **argv)
{
int listenfd, connfd, port;
char *haddrp;
socklen_t clientlen=sizeof(struct sockaddr_in);
struct sockaddr_in clientaddr;
if (argc != 2) {
fprintf(stderr, "usage: %s <port>
", argv[0]);
exit(0);
}
port = atoi(argv[1]);
Signal(SIGCHLD, sigchld_handler);
listenfd = Open_listenfd(port);
while (1) {
connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen);
if (Fork() == 0) {
haddrp = inet_ntoa(clientaddr.sin_addr);
Close(listenfd); /* Child closes its listening socket */
echo(connfd,haddrp); /* Child services client */ //line:conc:echoserverp:echofun
Close(connfd); /* Child closes connection with client */ //line:conc:echoserverp:childclose
exit(0); /* Child exits */
}
Close(connfd); /* Parent closes connected socket (important!) */ //line:conc:echoserverp:parentclose
}
}
- 截图
- 多线程实现
server2.c代码:
#include "csapp.h"
void *thread(void *vargp);
void echo(int connfd,char *haddrp);
char *haddrp;
int main(int argc, char **argv)
{
int listenfd, *connfdp, port, clientlen=sizeof(struct sockaddr_in);
struct sockaddr_in clientaddr;
pthread_t tid;
if (argc != 2) {
fprintf(stderr, "usage: %s <port>
", argv[0]);
exit(0);
}
port = atoi(argv[1]);
listenfd = Open_listenfd(port);
while (1) {
connfdp = Malloc(sizeof(int));
haddrp = inet_ntoa(clientaddr.sin_addr);
*connfdp = Accept(listenfd, (SA *) &clientaddr, &clientlen);
Pthread_create(&tid, NULL, thread, connfdp);
}
}
/* thread routine */
void *thread(void *vargp)
{
int connfd = *((int *)vargp);
Pthread_detach(pthread_self());
Free(vargp);
echo(connfd,haddrp);
Close(connfd);
return NULL;
}
- 两个客户端的连接截图:
运行期间遇到的问题:
问题:在做多线程和多进程时发现出现提示Address already be used 的提示,经过查询,发现是由于端口被占用。
解决:在网上查到了教程,解决了问题,截图在前文
1.查找被占用的端口
netstat -tln
netstat -tln | grep 8080
netstat -tln 查看端口使用情况,而netstat -tln | grep 8080则是只查看端口8080的使用情况
2.查看端口属于哪个程序?端口被哪个进程占用
lsof -i:8060
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Java 20804 root 36u IPv6 35452317 0t0 TCP *:pcsync-https (LISTEN)
3.杀掉占用端口的进程 根据pid杀掉
kill -9 进程id
kill -9 20804