西北工业大学网络编程技术重点Word格式文档下载.docx
《西北工业大学网络编程技术重点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《西北工业大学网络编程技术重点Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
其他辅助函数htons(),htonl(),ntohs(),ntohl();
,inet_addr(),inet_ntoa(),gethostbyname(),gethostbyaddr(),getservbyname()
三、数据结构(维护哪些数据)
1、WSADATA结构用来保存WSAStartup()返回的初始化信息
structWSAData{
WORDwVersion;
WORDwHighVersion;
charszDescription[WSADESCRIPTION_LEN+1];
charszSystemStatus[WSASYSSTATUS_LEN+1];
unsignedshortiMaxSockets;
unsignedshortiMaxUdpDg;
char*lpVendorInfo;
};
2、sockaddr结构体表示通用的Winsock地址结构,针对各种通信域的套接字,存储它们的地址信息
structsockaddr{
u_shortsa_family;
//地址族:
与socket()的第一个参数相同含义
charsa_data[14];
//协议地址,内容因具体协议而不同
};
3、sockaddr_in结构体指定Internet通信域的地址结构
structsockaddr_in{
shortsin_family;
//必须为AF_INET
u_shortsin_port;
//端口
structin_addrsin_addr;
//IP地址
charsin_zero[8];
四、基于TCP协议的Socket编程模型
五、C/S端基本思路
服务器程序需执行:
1初始化套接字接口,调用套接字动态链接库。
2创建套接字并将其与本机网络地址结构绑定。
3让程序处于监听状态,监听客户机的连接请求。
4若有连接请求,则处理并建立连接;
若未有连接请求,则阻塞并等待连接请求。
5接收或发送数据。
6关闭套接字。
7注销套接字接口,释放套接字动态链接库所占用资源。
客户机程序需执行:
8初始化套接字接口,调用套接字动态链接库。
9创建套接字。
10向服务器发送连接请求。
11接收或发送数据。
12关闭套接字。
13注销套接字接口,释放套接字动态链接库所占用资源。
六、基于UDP协议的Socket编程模型(两种)
模型
(一)的特点:
1、应用程序双份是对等的。
使用数据报套接字通信时都经过6个阶段:
2、双方必须确切地知道对方的网络地址,且将约定好的自己的网络地址绑定到自己的套接字上。
3、每次发送或接收数据报时,所使用的sendto()和recvfrom()中要包括对方的网络地址信息。
4、recvfrom()在没有收到数据前,默认情况下会阻塞,程序不向下执行。
模型
(二)的特点:
1、应用程序双份是不对等的。
服务器要先行启动,处于被动的等待访问状态;
客户机则可随时主动请求访问服务器。
2、完成一次通信时服务器要经过6个阶段:
而客户机不需要绑定套接字。
3、服务器将套接字绑定到周知的端口或指定的端口,且客户机必须确切地知道服务器端套接字使用的网络地址。
4、客户机套接字使用动态分配的自由端口,不需要进行绑定。
服务器事先不必知道客户机套接字使用的网络地址。
5、客户机必须先发送数据报,服务器收到后才能知道客户机的地址,才能给客户机回送数据报。
七、多线程,阻塞,非阻塞模式优缺点
1、阻塞模式:
优点:
1、I/O操作工作情况确定,包括调用、等待和返回三个阶段。
2、大部分情况下,操作都能成功完成,易编程实现。
缺点:
若需要建立多个套接字连接来为多个客户机服务时,或收发数据量不均衡时,或I/O时间不确定时,该模式性能低下,甚至无能为力。
解决方法:
使用多线程机制,并发运行为多个客户机服务。
2、非阻塞模式:
不会过多地占用CPU的控制权,及时释放系统资源。
编程时需要编写更多的代码,以把握成功调用I/O函数的时机。
I/O操作的随机性大,难以操作。
需要详细分析每次调用收到的WSAEWOULDBLOCK错误,采取相应的对策。
解决办法:
使用5种“套接字I/O模型”,通过异步的方式对一个或者多个套接字上进行的通信加以管理。
八、进程、线程概念
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。
九、多线程编程使用函数、定义、作用
1、工作线程函数
UINTThreadFunction(LPVOIDpParam)
{
//线程处理代码
While
(1)
//处理
}
return0;
2、创建线程函数CreateThread()
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORDdwCreationFlags,
LPDWORDlpThreadId
函数的功能:
一个进程的主线程是由操作系统自动生成的。
若要让一个主线程创建额外的子线程,则可以通过调用CreateThread()函数完成。
终止线程函数
3、终止线程的四种方式:
1)线程内部调用ExitThread()函数退出当前线程的执行。
函数功能:
线程内部调用该函数,退出线程执行。
函数定义:
voidExitThread(DWORDdwExitCode);
2)在线程外部利用线程句柄调用TerminateThread()函数强行终止一个线程的运行。
在线程外部调用该函数,强制终止线程运行。
函数的定义:
BOOLTerminateThread(
HANDLEhThread,
DWORDdwExitCode
3)工作线程函数正常返回(隐含调用ExitThread()函数)。
这是确保所有线程资源被系统正确回收的最佳方法。
4)包含线程的进程终止运行。
当整个进程已经正常终止,则进程内部线程所使用的资源已被系统正常回收。
4、挂起与恢复线程函数
挂起线程函数:
DWORDSuspendThread(HANDLEhThread)
恢复线程函数:
DWORDResumeThread(HANDLEhThread)
激活线程,恢复线程工作。
函数执行时,会检查线程的挂起次数,若挂起次数为0,表明该线程不处于挂起状态,否则该线程挂起次数值将减1。
5、睡眠线程函数:
voidSleep(DWORDdwMilliseconds)
线程使用sleep()函数睡眠,在睡眠时间内不被系统调度。
十、线程通信:
多线程Socket编程设计思路
方式2的设计思路
1.创建字节流套接字。
2.绑定本地服务器的网络地址。
3.调用listen函数,使套接字处于监听状态。
4.接收外来连接请求,accept函数返回新套接字。
5.与客户端进行数据交互。
6.关闭套接字,返回步骤4。
关闭操作可能由以下任意一种情况引发:
▪数据传输完毕,服务器主动关闭连接。
▪客户机已关闭连接。
▪服务器接收数据超时。
方式3的设计思路
4.以绑定的套接字为参数,创建工作线程,
5.工作线程完成客户端的服务请求,关闭线程的套接字并结束线程。
方式4的设计思路
4.以绑定的套接字为参数,创建第一个工作线程,
5.第一个工作线程处理客户机的连接请求,然后再创建第二个工作线程与客户机传输数据。
十一、*基于I/O模型的Socket编程,五种I/O模型及特点,基本概念使用效率分析比较
1、Select模型又称为选择模型,它可以使WindowsSockets应用程序同时对多个套接字进行管理,调用select()函数可以获取指定套接字的状态。
然后调用SocketAPI实现数据发送和接收等操作。
能够从单个线程的多个套接字上进行多重连接及I/O操作。
select()函数中使用集合来管理多个套接字。
默认情况下,套接字集合中包含64个元素,最多可以管理的套接字数量为1024个。
尽管Select模型可以同时管理多个连接,但对集合的管理比较繁琐。
每次在使用套接字发送和接收数据之前,都需要调用select()函数判断套接字的状态,这会导致CPU额外的负担,从而影响应用程序的工作效率。
2、WSAAsyncSelect模型又称为异步选择模型,它为每个套接字绑定一个消息。
当套接字上出现事先设置事件时,操作系统会给应用程序发送这个消息,从而使应用程序可以对该事件做相应的处理。
在系统开销不大的情况下可以同时处理许多个客户端连接。
即使应用程序不需要窗口,也要至少设计一个窗口用于处理套接字事件。
而且,在一个窗口中处理大量的事件也可能成为性能瓶颈。
3、WSAEventSelect模型又称为事件选择模型,它允许在多个套接字上接收以事件为基础的网络事件通知。
应用程序在创建套接字后,调用WSAEventSelect()函数将事件对象与网络事件集合相关联。
当网络事件发生时,应用程序以事件的形式接收网络事件通知。
4、重叠I/O模型又称为OverlappedI/O模型,基本设计原理是可以让应用程序使用重叠的数据结构一次投递多个I/O请求,当系统完成I/O操作后通知应用程序。
重叠I/O模型是真正意义上的异步I/O模型。
在应用程序中调用输入/输出函数后,程序将立即返回。
当I/O操作完成后,系统会通知应用程序。
5、完成端口(Completionport)是一种在Windows服务平台上比较成熟和高效的I/O操作方法,它使用线程池处理异步I/