1、编写基于tcp的c/s程序,服务器和客户端程序的基本流程是怎样的?使用api函数给出框架**。
答:tcpserver:
1 初始化ws2_
2 创建监听套接字。
3 填充sockaddr_in结构。
4 绑定监听套接字到一个本地地址。
5 进入监听模式。
6 循环接受客户的连接请求。
char buffer[128]=“1234567”
sockaddr_in remoteaddr;
int naddrlen = sizeof(remoteaddr);
socket sclient;
while(true)
// 接受一个新连接。
sclient = accept(slisten, (sockaddr*)&remoteaddr, &naddrlen);
if(sclient ==invalid_socket)continue;
/ 向客户端发送数据。
send(sclient, buffer, strlen(buffer), 0);
/ 关闭同客户端的连接。
closesocket(sclient);
/ 关闭监听套接字。
closesocket(slisten);
return 0;
tcpclient:
7 初始化ws2_
8 创建套接字。
9 填写远程地址信息。
10 连接服务器。
11 发送数据。
send(s,"hello",strlen("hello"),0);
12 接收数据。
char buff[256];
int nrecv = recv(s, buff, 256, 0);
if(nrecv > 0)handledata(buff);/handledata()为数据处理函数。
13 关闭套接字。
closesocket(s);
return 0;
2、q:请解释int listen(socket sockfd,int backlog)中backlog的具体含义。
a:指定了正在等待连接的最大队列长度,它的作用在于处理可能同时出现的几个连接请求。
3、q:调用connect()时触发什么过程?
a:三次握手过程。
4、q:udp编程时可否使用connect(),为什么?
a:可以使用。因为udp的客户端调用connect()函数时,并不是真正地发出建立请求连接的请求,调用将从本地操作系直接返回。
这样可以将服务器的地址信息保存下来,在后续udp端口发送数据时,由套接字自动在发送函数中填入服务器地址,而不需要由应用程序在调用发送函数时填入。
5、q:recvfrom()填入的地址的作用是什么?
a:用于返回发送方的地址(ip、port),如果不关心发送方地址时可设置地址参数为null;如果需要回复信息则要填入参数以便sendto时使用。
6、q:调用recvfrom()之前是否必须绑定?为什么?
a:不一定必须绑定。若在调用recvfrom()之前没有调用sendto()就必须调用bind()显式绑定;若在调用recvfrom()之前调用了sendto()则由系统自动绑定,不必显式绑定。
从以下方面比较wsaasyncselect模型和wsaeventselect模型的异同。
1 能处理的网络事件类型。
相同,常用网络事件包括fd_accept、fd_read、fd_write、fd_close
2 得到网络事件通知的途径。
不同。wsaasyncselect模型由操作系统捕获网络事件并封装成windwos消息,发送到窗口程序的消息队列中,应用程序从其消息队列中取出消息从而获得网络事件通知;而wsaeventselect模型是通过等待关联的事件状态变化来获取事件通知。
3 单线程能处理的套接字个数。
不同,wsaeventselect模型为64, wsaasyncselect模型没有限制。
4 判断网络事件类型和网络错误方法。
不同。wsaeventselect模型通过调用wsaenumnetworkevents()。if(lpnetworkevents-> lnetworkevents &fd_**则表示发生了对应的网络事件;
if(lpnetworkevents->ierrorcode[fd_**bit]!=0)表示发生了网络错误。
wsaasyncselect模型通过msg的附加信息来判断网络事件和网络错误。
wparam指定发生网络事件的套接字句柄。
lparam指定发生的网络事件和错误**。
其中高字位指出网络错误。采用宏:if(wsagetselecterror(lparam)表示发生网络错误。
低字位指出发生的网络事件,采用宏:
if(wsagetselectevent(lparam) =fd_**表示发生对应的网络事件。
5 触发fd_read和fd_write的条件(具体说明)
收到fd_read事件通知的情况:
1)调用 wsaasyncselect()对 socket 注册 fd_read 事件时,接收缓冲区中已有数据。
2)接收缓冲区由空变为有数据。
3)调用 recv()或 recvfrom()从接收缓冲区读取数据时没有读完。
收到fd_write事件通知的情况:
1) 使用connect或wsaconnect,一个套接字首次建立了连接。(针对客户端)
2) 使用accept或wsaaccept,套接字被接受以后。
3) 若send、wsasend、sendto或wsasendto操作失败,返回了wsaewouldblock错误,而且缓冲区的空间变得可用。
8、q:在tcp服务器编程时,可以对每个accept()返回的套接字创建线程来处理该套接字上的数据收发,这样做有什么缺点?第三章的io模型中哪些模型能改善这一缺点?为什么?
a:缺点:线程膨胀。
所有io模型均可以改善这一缺点。
select模型:通过设置套接字集合,可以在一个集合中管理64(default)个套接字。通过自定义fd_setsize管理更多的套接字。
wsaasyncselect模型:采用消息机制,调用wsaasyncselect()将套接字和窗口句柄关联起来,理论上可以管理的套接字数目没有限制,只是服务器性能会下降。
wsaeventselect模型:将每个套接字和一个事件对象关联,该模型最多等待64个套接字,也就是最多处理64套接字。连接套接字增加时可以使用线程池技术。
重叠io模型:使用重叠结构投递io请求后,重叠结构中事件对象受信,查询重叠操作结果,处理数据。采用单线程可以管理多个套接字,将套接字和套接字使用的io缓冲区以对象的形式组织成链表,通过套接字来创建其对应的缓冲区对象(包含一个重叠结构)。
1、q:套接字工作在阻塞模式下,列举5个会阻塞的winsock api函数。
a:accept(),send(),recv(),sendto(),recvfrom()
注意在非阻塞模式下这些函数不会阻塞。
2、q:列举ioctlsocket()函数两种用途。
a:1、设置套接字的工作模式。
2、获取套接字上可读取的数据量。
3、q: tcp编程时客户端程序是否需要调用bind()函数?为什么?
a:不需要,调用connect()函数时会隐式绑定。
4、q:重叠操作使用的重叠结构上的事件对象状态由无信号状态变为有信号状态,是否意味着这一次重叠操作成功完成?为什么?
a:不一定。事件对象状态由无信号状态变为有信号状态仅仅意味着这次操作完成。完成有成功和失败两种可能,因此编程时查询重叠操作结果后对返回值进行判断处理。
5、q:解决套接字工作在非阻塞模式下的wsaewouldblock错误需要解决什么根本问题?如何有效解决?
a:解决套接字上何时可以读写数据。使用io模型。
6、q:完成端口中per-handle数据和per-io数据各有什么作用?
客户上下文对象(单句柄数据):主要作用在于关联完成端口时传递套接字信息,在查询完成端口时该套接字信息会通过lpcompletionkey参数返回。
缓冲区对象(单io数据):主要作用在于投递重叠io时传递io信息,包括缓冲区,io类型、overlapped结构等等。在查询完成端口时通过lpoverlapped参数返回投递io时使用的重叠结构地址,通过该该结构获得投递io时使用单io数据。
通过二者可以确定已完成io的套接字以及该套接字上的io信息,进而处理数据。
7、q:实现广播和多播时能否使用流式套接字?为什么?
a:实现广播和多播时,不能使用流式套接字,只能使用数据报套接字。流式套接字一旦建立后,其通信的端点就固定不变,通信只能在两个端点之间进行,而广播和多播通信是一对多的通信,显然流式套接字不能满足要求,而数据报套接字为无连接的,指定发送的目的地址即可。
8、q:接收广播数据和接收一般udp数据有什么不同?
a:不同在于接收广播数据时必须显示绑定到发送时的目的端口,而接收普通udp数据时可以在sendto()调用时隐式绑定。
9、q:发送自己封装的udp数据报应遵循什么步骤。
a:1、首先以ippoto_udp为协议类型创建一个原始套接字,打开原始套接字上的ip_hdrincl选项;
2、然后构建udp封包(先设置ip头,再设置udp头,最后设置数据);
3、初始化完整的udp封包之后,调用sendto函数即可将它发送。
10、q:简述网络嗅探器的编写步骤。
1、创建原始套接字并绑定到明确的本地地址,不能使用inaddr_any。
2、调用ioctlsocket()设置混杂模式。
3、调用recv()函数获取数据包。
4、解析收到的数据包。
网络实习作业
上机实习五。网络信息检索与利用。负责收集农业机械化及其自动化高等学院。使用的搜索引擎 雅虎 检索策略 农业机械化及其自动化 inurl edu 检索结果 海南大学。农业机械化及其自动化。培养目标 培养具有机械学 自动化检测控制技术和农业机械装备等相关方面的基本理论 基本知识和基本技能,能够从事农业机...
网络培训学习作业
结合本次课程学习的体会,在您任教的年级中选择您感兴趣的教学内容,尝试设计出一组有效的教学提问,并谈谈您设计的理由。两位数乘两位数 案例。济渎路学校王兰芳师 你能根据学过的知识来解决24 12这个问题吗?学生可能出现如情况 1 24 24 24 24 288 元 12个24相加 2 24 2 6 28...
初中老师网络学习作业
自从我任教以来,一直在担任初中语文,在这十几年的语文教学中,感觉文言文部分对于老师教学和学生学习来说是最难的。这次学习 古汉语与初中文言文教学 对我来说是很兴奋的,终于有了经验可借鉴。在文言文教学中,我们要抱着 古文新教,古为今用,走出文言文教学的误区 的设计理念。尽量让学生喜欢上古文,教给他们以方...