写在前面:
没什么好说的。
目录
填空题
选择题
简答题
判断题
必考摆烂区
1.Winsock API安装在“传输层”和“应用层”之间
解析:
通过查阅socket的概念介绍得到答案。
socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
七层协议 举例 应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP 表示层 例如XDR、ASN.1、SMB、AFP、NCP 会话层 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets 传输层 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL 网络层 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25 数据链路层 例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP 物理层 例如线路、无线电、光纤、信鸽
2.Windows Sockets规范定义了一套Micosoft Windows下网络编程接口,它不仅包含了Berkeley Socket风格的库函数,也包含了一组针对Windows的扩展库函数。
14.应用程序调用Windows Sockets的API,实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用,实现实际的通讯工作。
15.Microsoft公司联合intel sun、informix、novell等几家公司共同制定了一套Windows操作系统下的网络变成接口,它就是Windows-Sockets规范。
解析自百度百科:
Windows Sockets规范以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者。一个网络软件供应商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容。
任何能够与Windows Sockets兼容实现协同工作的应用程序就被认为是具有Windows Sockets接口。我们称这种应用程序为Windows Sockets应用程序。
Windows Sockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的Windows Sockets实现都支持流套接口和数据报套接口.
应用程序调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。
3.流式套接字提供了双向的,有序的,无重复并且无记录边界的数据流服务。
解析自套接字编程原理:
socket共有以下几种不同类型
1.流式套接字(stream socket)
定义:#define SOCK_STREAM 1
流式套接字提供了双向,有序无重复以及无记录边界的数据流服务(适合处理大量数据),由于面向连接,所以必须建立数据传输链路。
2.数据报套接字(datagram socket)
定义:#define SOCK_DGRAM 2
数据报套接字支持双向的数据流但不保证传输数据的准确性,是无连接的。
3.原始套接字(raw-protocol interface)
定义:#define SOCK_RAW 3
4.基本套接字
socket开发所需要的文件
头文件:winsock2.h
库文件:WS2_32.LIB
动态库:WS2_32.DLL
4.Intel 86处理器上,用“小头”形式来表示多字节编号,“互联网联网标准”指定多字节值必须用“大头”形式来表示。
18.Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
19.Big-Endian就是低位字节放在内存的高地址端。
解析自字节排序
针对大头(big-endian)和小头(little-endian)形式的编号,不同计算机处理器的表示方法有所不同,根据各自的设计来决定:
Intel 86处理器上用小头形式来表示多字节编号(字节排序从最无意义的字节到最有意义的字节)。
互联网联网标准指定多字节值则必须用大头形式来表示(最有意义的字节到最无意义的字节)。
5.无保护消息边界的协议(或者是TCP协议)通常称作“基于流的协议”
解析:
TCP是面向流的协议,它是不保护消息边界的;(即无保护消息边界的协议)
UDP是面向消息的协议,它是保护消息边界的,
要保证你发的数据包每次接收的大小和发送时一样,应该使用UDP的协议.碎碎念:我觉得这题也可以填TCP
6.加载相应的Winsock DLL库通过调用WSAStartup()函数实现的。
20.Winsock应用程序第一个调用的API是WSAStartup()函数。
解析:
使用 DLL 之前,还需要调用 WSAStartup() 函数进行初始化,以指明 WinSock 规范的版本。
7.在面向连接的采用TCP协议的C/S模型通信程序中,只在服务端被调用,而不会在客户端被调用的两个Winsock API函数是 listen函数和accept函数(不确定)
解析:
WinSock API相关函数
1.socket函数
用于创建一个套接字
SOCKET socket ( int af, //表示地址家族 int type, //表示套接字类型 SOCKET_STREAM 表示流式套接字 SOCK_DGRAM 表示数据报套接字 int protocol //表示用于套接字的协议,一般为0即采用默认的TCP/IP协议 );
2.accept函数
用于接收客户端的连接请求
SOCKET accept ( SOCKET s,//套接字 应该处于监听状态 struct sockaddr FAR* addr, int FAR* addrlen );
3.bind函数
将套接字绑定到已知的地址上,执行成功返回值为0
int bind ( SOCKET s, const struct sockaddr FAR* name, int namelen );
4.closesocket函数
用于关闭套接字
int closesocket ( SOCKET s );
5.connect函数
用于发送一个连接请求,执行成功返回值为0,否则为SOCKET_ERROR
int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen );
6.htons函数
htons函数将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式。7.htonl函数
htonl函数将一个32位的无符号长整型数据由主机排列方式转换为网络排列方式。8.inet_addr函数
inet_addr函数将一个由字符串表示的地址转换为32位的无符号长整型数据。9.listen函数
listen函数用于将套接字置入监听模式。int listen ( SOCKET s, int backlog );
10.recv函数
recv函数用于从连接的套接字中返回数据。int recv ( SOCKET s, char FAR* buf, int len, int flags );
11.select函数
select函数用来检查一个或多个套接字是否处于可读、可写或错误状态。int select ( int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout );
12.send函数
send函数在已经建立连接的套接字上发送数据。int send ( SOCKET s, const char FAR * buf, int len, int flags );
13.WSAStartup函数
WSAStartup函数用于初始化WS2_32动态库。它应该是应用程序第1个调用的Windows Socket函数,用于确定Windows Socket使用的版本。int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
14.WSACleanup函数
WSACleanup函数与WSAStartup函数是相对的,用于终止使用WS2_32动态库。int WSACleanup (void);
15.WSAAsyncSelect函数
WSAAsyncSelect函数用于将网络中发生的事件关联到窗口的某个消息中。int WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );
8.Windows套接字在两种模式下执行I/O操作:阻塞和非阻塞,在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数(如send和recv)会一直持续下去,不会立即返回程序。
9.在非阻塞模式下调用Winsock API函数,常见的一个返回错误是SOCKET_ERROR
因为不确定 丢一下其他解析:
accept函数执行非阻塞套接字时,当链接队列上没有等待的链接,accept返回错误WSAEWOULDBLOCK(wsaewouldblock);
执行阻塞套接字时计入阻塞状态。
所有收发函数(recv/WSARecv、send/WSAsend)返回的错误码都是SOCKET_ERROR,最常见的错误是WSAConnaborted和WSAConnetset(关闭连接超时、通信放关闭连接),另外一个常见错误是WSAEwouldblock(指定函数暂时不能完成)
10.阻塞非阻塞表示某个进程中调用某个I/O函数可能出现的状态,是针对这个单进程角度来说的。同步异步表示一种写作方式,是从全局最高的角度“进程之间 合作的方式”,所以一般是异步配合非阻塞使用,同步配合阻塞使用。
11.在Winsock应用程序中,通过SOCKADDR_IN结构来指定IP地址和服务端口信息。
12.所谓的“从容关闭”套接字的方法,是通过调用shutdown函数来执行的。
从容关闭:shutdown()函数
直接关闭:closesocket()函数
13.套接字模型描述了一个应用程序如何对套接字上进行的I/O进行管理及处理。
14/15见上面
16.数据报套接字支持双向的数据流,但并不保证是可靠,有序,无重复的服务。
17.原始套接字允许对底层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。
21.在基于非连接协议的C/S模型通信程序中,服务端是依双方通信进程地位来定义,而非依靠于是否基于连接。
解析:
参考C/S模型通信程序定义:基于非连接协议且依靠双方通信进程地位来定义服务器端的通信模型
22.为WSAEventSelect创建的事件对象拥有两种工作状态,以及两种工作模式。两种工作状态分别是“已传信”和“未传信”。两种工作模式则包括“人工重设”和“自动重设”。
23.要具体获取某个Winsock API函数的调用返回错误码信息,可通过调用WSAGetLastError()函数来获取。
socket开发所需要的文件
头文件:winsock2.h
库文件:WS2_32.LIB
动态库:WS2_32.DLL
不成因果关系
从进程到内核传递套接字结构的函数有3个:bind、connect和 sendto 。这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小。
从内核到进程传递套接字结构的函数有4个:accept、recvfrom、getsockname和getpeername。这4个函数的其中两个参数是:套接字结构的指针 和 该结构大小的指针。
每次系统需要使用网络或者联网软件使用网络都会调用这个文件,如果这个文件丢失就会造成网络不稳定或者无法联网的情况。总的来说,ws2_32.dll就是控制电脑网络连接的软件(简单来说是提供参数验证的功能,通过其他几个选项也可以明白并非真正的实现网络操作。)
答案是CT6解析:
如果select调用完成后套接字仍然在readfds集合中,则套接字可读。
T7解析:
IP包的最大长度为64K,所以最多处理的套接字数量是64K
默认情况下套接字发送缓冲区大小为8K
答案为C
第十题答案C 第十一题答案BT9解析:
网络事件类型对事件数组中的事件进行引用时应该用WSAWaitForMultipleEvents的返回值减去预定义值WSA_WAIT_EVENT_0得到具体的引用值即索引位置
答案为CT11解析:
对不同的事件区分不同的消息是不可能的.下面的代码将不会工作;
第二个调用将会使第一次调用的作用失效,只有FD_WRITE会通过wMsg2消息通知到.
rc = WSAAsyncSelect(s, hWnd, wMsg1, FD_READ);
rc = WSAAsyncSelect(s, hWnd, wMsg2, FD_WRITE);
T13D T14A T15CWSAEventSelect模型
简单考虑就是2^3
同理几就是2的几次方
#define FD_READ_BIT 0 #define FD_READ (1 << FD_READ_BIT) lNetworkEvents :0000 0000 0000 0000 0000 0000 0000 0001 #define FD_WRITE_BIT 1 #define FD_WRITE (1 << FD_WRITE_BIT) lNetworkEvents :0000 0000 0000 0000 0000 0000 0000 0010 #define FD_ACCEPT_BIT 3 #define FD_ACCEPT (1 << FD_ACCEPT_BIT) lNetworkEvents :0000 0000 0000 0000 0000 0000 0000 1000 #define FD_CONNECT_BIT 4 #define FD_CONNECT (1 << FD_CONNECT_BIT) lNetworkEvents :0000 0000 0000 0000 0000 0000 0001 0000 #define FD_CLOSE_BIT 5 #define FD_CLOSE (1 << FD_CLOSE_BIT) lNetworkEvents :0000 0000 0000 0000 0000 0000 0010 0000
T13解析:
wParam参数指定了发生网络事件的套接字句柄。
IParam参数的低字位指定了发生的网络事件,高字位包含了任何可能出现的错误代码。
hWnd 参数指定一个窗口句柄,它对应于网络事件发生之后,想要收到通知消息的那个窗口。(通知消息窗口句柄)
T14解析:
用户线程发起 io 请求后会立即返回,并当内核态的 io 完毕后会将数据拷贝到用户态,然后再发送信号通知用户线程已就绪,整个过程用户线程是不会阻塞也不需要其它额外操作的,除了发起 io 请求,处理 io 和拷贝数据均由内核态完成。
T15解析:
这一题没有找到答案 但是感觉像四个
附上代码:
HANDLE hCompletion =::CreatrIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0);
writefds-数据能够发送
readfds-数据可读
exceptfds-检查数据错误
p28
待发送的数据长度为X,实际发送的字节总数为X'
1)X>最大长度:error(X>64K)
2)Sysbuf size(缓冲区大小)
- 阻塞模式:等待,成功后发送X'=X
- 非阻塞模式:X'=min{本地系统缓存大小,远端系统缓存大小}
3)X
事实上也不算判断题,从书上找的句子拿来巩固一下。能不能压中看运气吧。
1.send函数发送成功意味着数据传送到达网络/到达接收端TCP/到达接收端应用程序(x)
p27
2.send函数成功意味着数据已经传达到目的主机(x)
p27
只是意味着数据从应用程序的数据缓冲区拷贝到套接字的数据发送缓冲
3.对每个离散写命令来说,如果传送协议把它们当做一条独立的消息在网上传送,即可说该协议面向消息。(√)
4.所有Windows平台都支持套接字以锁定或非锁定方式工作,但并非每种平台都支持每一种IO模型(√)
5.receive()调用一次可以同时接收到多个TCP报文段数据报(√)
6.在默认创建的套接字上调用WSAEventSelect、WSAAsyncSelect函数后套接字的模式就会从“非阻塞”自动变为“阻塞”(x)
(阻塞,非阻塞,默认情况下创建的套接字的工作模式是阻塞模式,某个套接字上调用某种IO模型后会改变某种套接字的工作模式,调用WSAAsyncSelect和WSAEventSelect这些IO模型函数后会使套接字从默认阻塞变为非阻塞)
7.在MFC中,CAsyncSocket类是一个异步非阻塞Socket封装类,而CSocket类是一个同步阻塞Socket封装类。CAsyncSocket类继承自CSocket类(x)
Csocket同步阻塞
CAsyncSelect异步非阻塞
8.流套接字(TCP)使用了双向有序可靠且无记录边界的数据流服务,数据报套接字(UDP)使用了不可靠无序且有记录边界的数据流服务。
recv和recvfrom的区别:
对于recvfrom 可同时应用于面向连接的和无连接的套接字。
recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
send和sendto的区别:
send函数一般用于TCP链接,sendto函数一般用于UDP连接
T1:如可使用AcceptEx函数来接受客户连接,试说明每个AcceptEx函数参数的含义。
BOOL AcceptEx(
SOCKET sListenSocket,
侦听套接字,服务器应用程序在这个套接字上等待连接。
SOCKET sAcceptSocket,
指定一个未被使用的套接字使其接受新的连接。
PVOID lpOutputBuffer,
输出缓冲区,用来取得在新连接上接收到的第一块数据、该服务器的本地地址和客户端的远程地址。
DWORD dwReceiveDataLength,
指定接受数据缓冲区lpOutputBuffer的大小。
DWORD dwLocalAddressLength,
缓冲区中为本地地址预留的长度,必须比最大地址长度多16。
DWORD dwRemoteAddressLength,
缓冲区中为远程地址预留的长度,必须比最大地址长度多16。
LPDWORD lpdwBytesReceived,
用于取得接受到数据的长度
LPOVERAPPED lpOverlapped
用于指定来处理本请求的OVERLAPPED结构,不能为NULL。
);
T2:TIME_WAIT状态的主要作用。
可靠的关闭连接
防止上一次连接中的分段延迟到达后影响新连接
T3:Winsock分别提供了哪两种套接字
流式套接字(TCP)和数据报套接字(UDP)
套接字模式(阻塞和非阻塞)和套接字I/O模型
C/S模型对应B/S模型
客户(client)/服务器(server)模型对应浏览器/服务器模型
参考(在基于非连接协议的C/S模型通信程序中,服务端是依双方通信进程地位来定义,而非依靠于是否基于连接。)
流式套接字(SOCK_STREAM):该类套接字提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务
T5:socket函数的三个参数
地址族,套接字类型和协议
T6:套接字的基本概念:
应用程序和TCP/IP协议交互的接口
流套接字的概念:
一种使用TCP协议传书面向连接的可靠有序字节流的套接字
T7:winsocket接口的概念
一个开放的,支持多个协议的Windows下的网络编程接口
T8:C/S模型
基于非连接协议且依靠双方通信进程地位来定义的通信模型
T9:TIME_WAIT的主要作用
可靠的关闭连接
防止上一次连接中的分段延迟到达后影响新连接
T10:Big-Endian的概念
即“大头”模式,互联网联网协议标准制定多字节值用大头形式来表示(最有意义的字节到最无意义的字节)
低位字节放在内存的高地址端。
T11:五种I/O模型
五种 I/O 模型,包括select,WSAAsyncSelect,WSAEventSelect,OverlappedIO,IOCP。
T12:WSAEventSelect模型工作状态从已传信改成未传信方法
调用WSAResetEvent()函数
T13:套接字模型的概念
描述了一个应用程序如何对套接字上的I/O进行管理及处理
T14:如何从容关闭
使用shutdown函数
int shutdown( SOCKET s, int how );
直接关闭(closesecket函数)