课下作业和课上作业
课下作业
课上练习3
要求
基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
服务器响应消息格式是
“
客户端IP:XXXX
服务器实现者学号:
当前时间: XX:XX:XX
”
上方提交代码
提交一个客户端至少查询三次时间的截图测试截图
提交至少两个客户端查询时间的截图测试截图
实现过程
首先下载csapp.h和csapp.c,这两个在网上查的时候所给的网址无法打开,始终无法找到这两个文件,只能从同学的码云上下载了这两个文件。
client
service
完成截图
课下练习1
要求
1 完成家庭作业4.47,4.48,4.49
2 相应代码反汇编成X86-64汇编
3 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码
发操作过程、测试、问题解决过程博客链接
完成过程
首先把代码改成指针的类型:
for(j=i;j<count;j++)
{
if(*(data+i)>*(data+j))
{
int temp;
temp=*(data+i);
*(data+i)=*(data+j);
*(data+j)=temp;
}
}
}
}
main()
{
long data[10];
int i;
printf("请输入数字:");
for(i=0;i<10;i++)
scanf("%d",&data[i]);
bubble(&data,10);
for(i=0;i<10;i++)
printf("%d\t",data[i]);
}
然后再输入
1.gcc -S -o main.s main.c
2.as -o main.o main.s
3.objdump -d main.o
就会出现x86-64的汇编代码
下课练习2
要求
把课上练习3的daytime服务器分别用多进程和多线程实现成并发服务器并测试
实现过程
/*
* echoservert.c - A concurrent echo server using threads
*/
/* $begin echoservertmain */
#include "csapp.h"
void echo(int connfd);
void *thread(void *vargp);
char *haddrp;
int main(int argc, char **argv)
{
int listenfd, *connfdp, port;
socklen_t clientlen=sizeof(struct sockaddr_in);
struct sockaddr_in clientaddr;
pthread_t tid;
if (argc != 2) {
fprintf(stderr, "usage: %s <port>\n", argv[0]);
exit(0);
}
port = atoi(argv[1]);
listenfd = Open_listenfd(port);
while (1) {
connfdp = Malloc(sizeof(int)); //line:conc:echoservert:beginmalloc
*connfdp = Accept(listenfd, (SA *) &clientaddr, &clientlen); //line:conc:echoservert:endmalloc
haddrp = inet_ntoa(clientaddr.sin_addr);
Pthread_create(&tid, NULL, thread, connfdp);
}
}
/* thread routine */
void *thread(void *vargp)
{
int connfd = *((int *)vargp);
Pthread_detach(pthread_self()); //line:conc:echoservert:detach
Free(vargp); //line:conc:echoservert:free
echo(connfd);
Close(connfd);
return NULL;
}
/* $end echoservertmain */
void echo(int connfd)
{
static char timestr[40];
time_t t;
struct tm *nowtime;
time(&t);
nowtime = localtime(&t);
strftime(timestr,sizeof(timestr),"%Y-%m-%d %H:%M:%S",nowtime);
size_t n;
char buf[MAXLINE];
rio_t rio;
Rio_readinitb(&rio, connfd);
while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) { //line:netp:echo:eof
printf("server received %d bytes\n", (int)n);
printf("客户端IP:%s\n",haddrp);
printf("服务器实现者学号:20155301\n");
printf("当前时间:%s\n",timestr);
printf("\n");
Rio_writen(connfd, buf, n);
}
}