网络程序设计考试题目Word文档格式.docx
《网络程序设计考试题目Word文档格式.docx》由会员分享,可在线阅读,更多相关《网络程序设计考试题目Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
如何赋值?
sockaddr包括sockaddr_in和sockaddr_un等,前者用于inet(网络)后者用于unix文件。
sockaddr是winsockAPI中参数的基本形式,sockaddr_in是其IP地址结构。
sockaddr是通用的套接字地址,而sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。
二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。
一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。
4建立tcp连接客户端和服务端的过程。
为什么服务端要调用bind函数而客户端不用?
为什么服务端需要指定端口而客户端不用?
建立基于udp的收发程序的过程
服务端则需用bind函数连接和接收数据报
因为服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号,而客户端不用。
服务端需要通过指定端口来接收客户的请求连接。
5简述IP协议的特点
TCP/IP协议的特点
①TCP/IP协议并不依赖于特定的网络传输硬件,所以TCPIIP协议能够集成各种各样的网络。
用户能够使用以太网(Ethernet)、令牌环网(TokenRingNetwork)、拨号线路(Dial-upline)、X.25网以及所有的网络传输硬件。
②TCP/IP协议不依赖于任何特定的计算机硬件或操作系统,提供开放的协议标准,即使不考虑Internet,TCP/IP协议也获得了广泛的支持。
所以TCP/IP协议成为一种联合各中硬件和软件的实用系统。
③TCP/IP工作站和网络使用统一的全球范围寻址系统,在世界范围内给每个TCP/IP网络指定唯一的地址。
这样就使得无论用户的物理地址在哪儿,任何其他用户都能访问该用户。
6广播组播通信与点对点通信的区别
广播主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要)。
组播主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。
主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。
点对点主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。
至于区别嘛,从MAC地址上来分,MAC地址是6个字节的,如果全是1就是广播,如果第一个字节是01就是组播啦,其它的就是单播。
7阻塞与非阻塞通信的区别
以套接字为例,在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。
而在非阻塞模式下,调用将直接返回而不需等待。
在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;
而在非阻塞模式下,将直接返回而不需等待。
对于UDP协议而言,由于UDP没有发送缓存,因此所有UDP协议即使在阻塞模式下也不会发生阻塞。
对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。
在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;
但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。
8select函数工作机制分析
select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读
9使用事件通知模型实现异步传输的过程描述(自己的语言),WSAEventSelect函数的作用说明
WSAAsyncSelect使用此模型,应用程序可在一个套接字上进行以windows消息为基础的网络事件通知,此模型提供了读写数据能力的异步通知,但不提供异步数据传送。
异步数据传送有“重叠及完成端口模型提供”。
过程:
(1)初始化套接字相关信息:
(2)开始启动一个事件通知。
WSAAsyncSelect(Sock,hWnd,自定义消息,网络事件)
(3)响应窗口的自定义消息处理函数, 其中lparam的高位字包含了可能出现的错误
代码,低字节表示发生的网络事件。
wParam表示发生网络事件的套接字。
10WSAAsyncSelect函数和windows消息机制的结合过程,一般来说,监听套接字需要处理哪些网络事件?
会话套接字需要处理哪些网络事件?
11windows消息处理过程
窗口消息处理程序与窗口类别相关,窗口类别是程序呼叫RegisterClass注册的。
依据该类别建立的窗口使用这个窗口消息处理程序来处理窗口的所有消息。
Windows通过呼叫窗口消息处理程序对窗口发送消息。
在第一次建立窗口时,Windows呼叫WndProc。
在窗口关闭时,Windows也呼叫WndProc。
窗口改变大小、移动或者变成图示时,从菜单中选择某一项目、挪动滚动条、按下鼠标按钮或者从键盘输入字符时,以及窗口显示区域必须被更新时,Windows都要呼叫WndProc。
12Windows消息处理函数的四个参数分别是什么?
携带了什么信息?
1、消息的组成:
一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。
当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。
2、谁将收到消息:
一个消息必须由一个窗口接收。
在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。
3、未处理的消息到那里去了:
M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。
正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。
4、窗口句柄:
说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。
而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。
13windows的线程函数使用什么作为参数?
如果要从主线程(通常为界面线程)传递数据给工作线程,应如何传递?
如果要从工作线程传递数据给主线程(界面线程有窗口),应如何传递?
线程的创建和终止
WindowsAPI提供了CreateThread()函数来创建一个线程。
其原型如下所示:
HANDLECreateThread(LPSECURITY_ATTRIBUTESsecAttr,
SIZE_TstackSize,
LPTHREAD_START_ROUTINEthreadFunc,
LPVOIDparam,
DWORDflags,
LPDWORDthreadID);
在此,secAttr是一个用来描述线程的安全属性的指针。
如果secAttr是NULL,就会使用默认的安全描述符。
每个线程都具有自己的堆栈。
可以使用stackSize参数来按字节指定新线程堆栈的大小。
如果这个整数值为0,那么这个线程堆栈的大小与创建它的线程相同。
如果需要的话,这个堆栈可以扩展。
(通常使用0来指定线程堆栈的大小)。
每个线程都在创建它的进程中通过调用线程函数来开始执行。
线程的执行一直持续到线程函数返回。
这个函数的地址(也就是线程的入口点)在threadFunc中指定。
每个线程函数都必须具有这样的原型:
DWORDWINAPIthreadfunc(LPVOIDparam);
需要传递给新线程的任何参数都在CreateThread()的param中指定。
线程函数在它的参数中接收这个32位的值。
这个参数可以用作任何目的。
函数返回它的退出状态。
参数flags确定了线程的执行状态。
如果它是0,线程会立即执行。
如果是CREATE_SUSPEND,线程则以挂起状态创建并等待执行。
(可以通过调用ResumeThread()来开始执行,稍后讨论)。
与线程相关的标识符以threadID所指向的长整型返回。
如果成功,函数则向线程返回一个句柄。
如果失败,则返回NULL。
可以通过调用CloseHandle()来显式销毁这个线程。
否则,会在父进程结束时自动销毁它。
如前所述,当线程的入口函数返回时终止执行线程。
进程也可以使用TerminateThread()或者ExitThread()来手动终止线程,这两个函数的原型如下:
BOOLTerminateThread(HANDLEthread,DWORDstatus);
VOIDExitThread(DWORDstatus);
对于TerminateThread(),thread是将要终止的线程的句柄。
ExitThread()只能用来终止调用了ExitThread()的线程。
对于两个函数而言,status是终止状态。
TerminateThread()如果成功,则会返回非0值,否则返回0。
调用ExitThread()在功能上等价于允许线程函数正常返回。
这意味着堆栈会正确地重新设置。
当使用TerminateThread()结束线程时,线程会立刻终止,而会执行任何特定的清理任务。
另外,TerminateThread()可能会停止正在执行重要操作的线程。
为此,当入口函数返回时,通常最好(也是最容易的)让线程正常终止。
14windows的MSG结构包括哪些内容?
在Windows程序中,消息是由MSG结构体来表示的。
MSG结构体的定义如下(参见MSDN):
typedefstructtagMSG{
HWNDhwnd;
UINTmessage;
WPARAMwParam;
LPARAMlParam;
DWORDtime;
POINTpt;
}MSG;
该结构体中各成员变量的含义如下:
一个消息一般都是与某个窗口相关联的。
例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。
在Windows程序中,用HWND类型的变量来标识窗口。
第二个成员变量message指定了消息的标识符。
在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。
但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是WindowMessage的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。
例如,鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等。
在程序中我们通常都是以WM_XXX宏的形式来使用消息的。
提示:
如果想知道WM_XXX消息对应的具体数值,可以在VisualC++开发环境中选中WM_XXX,然后单击鼠标右键,在弹出菜单中选择gotodefinition,即可看到该宏的具体定义。
跟踪或查看某个变量的定义,都可以使用这个方法。
第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。
例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。
wParam、lParam表示的信息随消息的不同而不同。
如果想知道这两个成员变量具体表示的信息,可以在MSDN中关于某个具体消息的说明文档查看到。
读者可以在VC++的开发环境中通过gotodefinition查看一下WPARAM和LPARAM这两种类型的定义,可以发现这两种类型实际上就是unsignedint和long。
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。
15CSocket与CWSAAsyncSelect两个类的使用
CSocket的使用
1、创建一个MFC对话框文档
2、在App类中的
BOOL
CMyApp:
:
InitInstance()
{
if(
!
AfxSocketInit()
)
AfxMessageBox("
IDP_SOCKETS_INIT_FAILED"
);
return
FALSE;
}
……
3.Add
New
Class
——
从CSocket下派生一个CMySocket,并增加一个成员变量
class
CMySocket
:
public
CSocket
public
CMyView
*m_pView;
4.在CMyView内加入一个CMySocket类成员函数m_socket
5.加入一个Button,为创建一个套接字
void
CMyView:
OnButtonCreateSocket()
m_socket.m_pView
=
this;
m_socket.Create(port,SOCK_DGRAM);
6.加入一个Button,让后加入该Button的消息响应函数
OnButtonSend()
char
buffer[]
"
Test"
;
m_socket.SendTo(buffer,strlen(buffer),"
192.168.1.1"
9000);
7.加入一个函数如下
OnReceived()
buffer[2048];
CString
hostaddr="
UINT
hostport=0;
int
len
m_socket.ReceiveFrom(buffer,2048,hostaddr,hostport);
buffer[len]='
0'
MessageBox(buffer);
8.加入CMySocket的一虚函数OnReceive
m_pView->
OnReceived();
}
CWSAAsyncSelect的使用
简述:
通知套接口有请求事件发生.
#include<
winsock.h>
intPASCALFARWSAAsyncSelect(SOCKETs,HWNDhWnd,
unsignedintwMsg,longlEvent);
s标识一个需要事件通知的套接口的描述符.
hWnd标识一个在网络事件发生时需要接收消息的窗口句柄.
wMsg在网络事件发生时要接收的消息.
lEvent位屏蔽码,用于指明应用程序感兴趣的网络事件集合.
注释:
本函数用来请求WindowsSocketsDLL为窗口句柄发一条消息-无论它何时检测到由lEvent参数指明的网络事件.要发送的消息由wMsg参数标明.被通知的套接口由s标识.
本函数自动将套接口设置为非阻塞模式.
lEvent参数由下表中列出的值组成.
值意义
FD_READ欲接收读准备好的通知.
FD_WRITE欲接收写准备好的通知.
FD_OOB欲接收带边数据到达的通知.
FD_ACCEPT欲接收将要连接的通知.
FD_CONNECT欲接收已连接好的通知.
FD_CLOSE欲接收套接口关闭的通知.
启动一个WSAAsyncSelect()将使为同一个套接口启动的所有先前的WSAAsyncSelect()作废.例如,要接收读写通知,应用程序必须同时用FD_READ和FD_WRITE调用WSAAsyncSelect(),如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
对不同的事件区分不同的消息是不可能的.下面的代码将不会工作;
第二个调用将会使第一次调用的作用失效,只有FD_WRITE会通过wMsg2消息通知到.
rc=WSAAsyncSelect(s,hWnd,wMsg1,FD_READ);
rc=WSAAsyncSelect(s,hWnd,wMsg2,FD_WRITE);
如果要取消所有的通知,也就是指出WindowsSockets的实现不再在套接口上发送任何和网络事件相关的消息,则lEvent应置为0.
rc=WSAAsyncSelect(s,hWnd,0,0);
尽管在本例中,WSAAsyncSelect()立即使传给该套接口的事件消息无效,仍有可能有消息等在应用程序的消息队列中.应用程序因此也必须仍准备好接收网络消息-即使消息作废.用closesocket()关闭一个套接口也同样使WSAAsyncSelect()发送的消息作废,但在closesocke()之前队列中的消息仍然起作用.
由于一个已调用accept()的套接口和用来接收它的侦听套接口有同样的属性,任何为侦听套接口设置的的WSAAsyncSelect()事件也同样对已接收的套接口起作用.例如,如果一个侦听的套接口有WSAAsyncSelect()事件FD_ACCEPT,FD_READ,FD_WRITE,则任何在那个侦听的套接口上接收的套接口将也有FD_ACCEPT,FD_READ,FD_WRITE事件,以及同样的wMsg的值.若需要不同的wMsg及事件,应用程序应调用WSAAsyncSelect(),将已接收的套接口和想要发送的新消息作为参数传递.
当某一套接口s上发生了一个已命名的网络事件,应用程序窗口hWnd会接收到消息wMsg.wParam参数标识了网络事件发生的套接口.lParam的低字指明了发生的网络事件.lParam的高字则含有一个错误代码.该错误代码可以是winsock.h中定义的任何错误.
错误代码和事件可以通过WSAGETSELECTERRORH和WSAGETSELECTEVENT宏从lParam中取出.定义如下:
#defineWSAGETSELECTERROR(lParam)HIWORD(lParam)
#defineWSAGETSELECTEVENT(lParam)LOWORD(lParam)
注意:
在accept()调用和为改变事件或wMsg的WSAAsyncSelect()调用中有一个计时窗口.应用程序如果需要给侦听的和调用过accept()的套接口以不同的wMsg,它就应该在侦听的套接口上请求FD_ACCEPT事件,然后在accept()调用后设置相应的事件.由于FD_ACCEPT从不发送给已连接的套接口,而FD_READ,FD_WRITE,FD_OOB及FD_CLOSE也从不发送给侦听套接口,所以不会产生困难.
使用以上的宏将最大限度的提高应用程序的可移植性.
返回的可能网络事件如下:
FD_READ套接口s准备读
FD_WRITE套接口s准备写
FD_OOB带外数据准备好在套接口s上读.
FD_ACCEPT套接口s准备接收新的将要到来的连接.
FD_CONNECT套接口s上的连接完成.
FD_CLOSE由套接口s标识的连接已关闭.
返回值:
0若应用程序感兴趣的网络事件的声明成功.
SOCKET_ERROR否则.可通过调用WSAGetLastError()返回特定的错误代码.
评价:
尽管WSAAsyncSelect()可以以多个事件的组合来调用,应用程序窗口还是会为每个网络事件接收一条消息.
如同select()函数,WSAAsyncSelect()会被频繁地调用来决定,何时一次数据转移操作(send()或recv())可以启动,并且可以立刻成功.尽管如此,健壮的应用程序必须做好这样的准备,即它可能接收到消息及启动了一个会立即返回WSAEWOULDBLOCK的WindowsSocketsAPI调用.例如,下列的事件序列是可能的:
(i)数据到达套接口s;
WindowsSockets传递WSAAsyncSelect消息.
(ii)应用程序处理其它一些消息.
(iii)在处理过程中,应用程序启动了ioctlsocket(s,FIONREAD...)并且注意到有数据准备好读.
(iv)应用程序启动recv(s,...)来读数据.
(v)应用程序循环处理下一条消息,最终到达WSAAsyncSelect消息,表示数据已准备好读.
(vi)应用程序启动recv(s,...),但失败并有错误WSAEWOULDBLOCK.
其它的事件序列也是可能的.
WindowsSocketsDLL不会不断地为某一特定的网络事件向一个应用程序发送消息.如果已成功地向应用程序窗口发送了一特定事件的通知,对该应用程序窗口将不再为该网络事件发消息,直到应用程序调用函数隐含地重新通知该网络事件.
事件重新通知函数
FD_READrecv()或recvfrom()
FD_WRITEsend()或sendto()
FD_OOBrecv()
FD_ACCEPTaccept()
FD_CONNECT无
FD_CLOSE无
任何对重新通知函数的调用,即使失败,也