《TCPIP网络编程》课后练习答案第一部分6~10章尹圣雨
《TCPIP⽹络编程》课后练习答案第⼀部分6~10章尹圣⾬
第六章基于UDP的服务器端/客户端
1. UDP为什么⽐TCP速度快?为什么TCP数据传输可靠⽽UDP数据传输不可靠?
UDP和TCP不同,不进⾏流量控制。由于该控制涉及到套接字的连接和结束,以及整个数据收发过程,因此,TCP传输的数据是可以信赖的。相反,UDP不进⾏这种控制,因此⽆法信任数据的传输,但正因UDP不进⾏流量控制,所以⽐TCP更快
2. bce
3. UDP数据包向对⽅主机的UDP套接字传递过程中,IP和UDP分别负责哪些部分?
IP负责链路选择。UDP负责端到端的传输
4. UDP⼀般⽐TCP快,但根据交换数据的特点,其差异可⼤可⼩。请说明何种情况下UDP的性能优于TCP
UDP与TCP不同,不经过连接以及断开SOCKET的过程,因此,在频繁的连接及断开的情况下,UDP的数据收发能⼒会凸显出更好的性能。
5. 客户端TCP套接字调⽤connect函数时⾃动分配IP和端⼝号。UDP中不调⽤bind函数,那何时分配IP和端⼝号?
⾸次调⽤sendto函数时,发现尚未分配信息,则给相应的套接字⾃动分配IP和端⼝号
6. TCP客户端必须调⽤connect函数,⽽UDP中可以选择性调⽤。请问,在UDP中调⽤connect函数有哪些好处?
每当以UDP套接字为对像调⽤sendto函数时,都要经过以下过程
1. 第⼀阶段:为⽬标UDP注册端⼝和IP
2. 第⼆阶段:数据传输
3. 第三阶段:删除UDP注册的IP和端⼝信息
其中,只要调⽤connect函数,就可以忽略每次传输数据时反复进⾏的第⼀阶段和第三阶段。然⽽,调⽤connect函数并不意味着经过连接过程,只是将IP地址和端⼝号指定在UDP的发送对象上。这样connect函数使⽤后,还可以⽤write、read函数进⾏数据处理,⽽不必使⽤sendto、recvfrom
7. 收发的消息均要输出到控制台窗⼝
/********************************uchar_server.c***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
int main(int argc, char *argv[])
{
int serv_sock;
char message[BUF_SIZE];
int str_len;
socklen_t clnt_adr_sz;
struct sockaddr_in serv_adr, clnt_adr;
if(argc!=2){
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
serv_sock=socket(PF_INET, SOCK_DGRAM, 0);
if(serv_sock==-1)
if(serv_sock==-1)
error_handling("UDP socket creation error");
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[1]));
if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)  error_handling("bind() error");
clnt_adr_sz=sizeof(clnt_adr);
while(1)
{
str_len=recvfrom(serv_sock, message, BUF_SIZE, 0,
(struct sockaddr*)&clnt_adr, &clnt_adr_sz);
message[str_len]=0;
printf("Message from client: %s", message);
fputs("Insert message(q to quit): ", stdout);
fgets(message, sizeof(message), stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
sendto(serv_sock, message, strlen(message), 0,
(struct sockaddr*)&clnt_adr, clnt_adr_sz);
}
close(serv_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
/********************************uchar_client.c***********************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
老鼠怎么灭
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
好听的草原歌曲大全int main(int argc, char *argv[])
{
int sock;
char message[BUF_SIZE];
int str_len;
socklen_t adr_sz;
struct sockaddr_in serv_adr, from_adr;
if(argc!=3){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock=socket(PF_INET, SOCK_DGRAM, 0);
if(sock==-1)
ipad怎么下载软件
error_handling("socket() error");
error_handling("socket() error");
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
serv_adr.sin_port=htons(atoi(argv[2]));
while(1)
{
fputs("Insert message(q to quit): ", stdout);
fgets(message, sizeof(message), stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
sendto(sock, message, strlen(message), 0,
(struct sockaddr*)&serv_adr, sizeof(serv_adr));
adr_sz=sizeof(from_adr);
str_len=recvfrom(sock, message, BUF_SIZE, 0,
(struct sockaddr*)&from_adr, &adr_sz);
message[str_len]=0;
printf("Message from server: %s", message);
}
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
第七章优雅地断开套接字连接
1. 解释TCP中“流”的概念。UDP中能否形成流?请说明原因
TCP的流指,两台主机通过套接字建⽴连接后进⼊可交换数据的状态,也称为“流形成的状态”。⽽对于UDP来说,不存在流,因为两个SOCKET不能相互连接
2. Linux中的close函数或Windows中的closesocket函数属于单⽅⾯断开连接的⽅法,有可能带来⼀些问题。什么是单⽅⾯断开连接?
什么情况下会出现问题?
单⽅⾯的断开连接意味着套接字⽆法再发送数据。⼀般在对⽅有剩余数据为发送完成时,断开⼰⽅连接,会造成问题。
3. 什么是半关闭?针对输出流执⾏半关闭的主机处于何种状态?半关闭会导致对⽅主机接收什么信息?
半关闭是指只完成输⼊和输出流中的⼀个。⽽且,如果对输出流进⾏半关闭,EOF⽆法被传送到对⽅主机,⼰⽅套接字⽆法传送数据,但可以接收对⽅主机传送的数据。
第⼋章域名及⽹络地址
1. bd
2. …
如果⽹络上没有特别的限制,可以将与本地⽹络相连的DNS服务器指定为其他完好的DNS服务器。因此,东秀提议的⽅法可能成为解决⽅法。也就是说,静洙可以不去⽹吧
3. …
1. 计算机向DNS服务器询问IP地址
2. 默认DNS服务器没有IP地址信息,因此向DNS主机发出询问
3. DNS查询服务器从其更上级的DNS服务器接收IP地址信息
4. DNS查询服务器将查到的IP地址逐级返还给主机
5. ⽹络浏览器访问接收到的IP地址⽹站
第九章套接字的多种可选项
1. 下列关于Time-wait状态的说法错误的是?acd(作者的答案就acd,⾄于d选项是否有问题,见仁见智)
2. TCP_NODELAY可选项与Nagle算法有关,可通过它禁⽌Nagle算法。请问何时应考虑禁⽤Nagle算法?结合收发数据的特性给出说
根据传输数据的特性,⽹络流量未受太⼤影响时,不使⽤Nagle算法要⽐使⽤它时传输速度快。例如“传输⼤⽂件数据”。将⽂件数据传⼊输出缓冲不会花太多时间,因此,即便不使⽤Nagle算法那,也会在装满输出缓冲时传输数据包。这不仅不会增加数据包的数量,反⽽会在⽆需等待ACK的前提下连续传输,因此可以⼤⼤提⾼传输速度。
第⼗章多进程服务器端
1. 下列关于进程的说法错误的是?cd
2. 调⽤fork函数将创建⼦进程,以下关于⼦进程描述错误的是?acd(a选项我测试过,真的不会销毁)
3. 创建⼦进程时将复制⽗进程的所有内容,此时的复制对象也包含套接字⽂件描述符。编写程序验证复制的⽂件描述符整数值是否与原
⽂件描述符整数值相同。
#include <stdio.h>
火灾报警打一数字
#include <unistd.h>
新冠疫苗接种禁忌症和注意事项
#include <sys/socket.h>
int main(int argc, char *argv[])
{
pid_t pid;
int sockfd=socket(PF_INET, SOCK_STREAM, 0);
pid=fork();
if(pid==0)
printf("Child sock fd: [%d] \n", sockfd);
else
printf("Parent sock fd: [%d] \n", sockfd);
return 0;
}
显⽰
Parent sock fd: [3]
Child sock fd: [3]
4. 请说明进程变为僵⼫进程的过程及预防措施
僵⼫进程是⼦进程。在⼦进程结束时,其返回值会传到操作系统,直到返回值被其⽗进程接收为⽌,该(⼦)进程会⼀直作为僵⼫进程存在。所以,为了防⽌这种情况的发⽣,⽗进程必须明确接收⼦进程结束时的返回值。
5. 编写程序使其每隔1秒输出简单字符串,并适⽤于上述时间处理器注册代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void ctrl_handler(int sig);
int main(int argc, char *argv[])
面疙瘩{
struct sigaction act;
act.sa_handler=ctrl_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGINT, &act, 0);
while(1)
{
sleep(1);
puts("Have a nice day~");
}
return 0;
}
void ctrl_handler(int sig)
{
char ex;
fputs("Do you want exit(Y to exit)? ", stdout);
scanf("%c", &ex);
if(ex=='y' || ex=='Y')
exit(1);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。