




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网络编程学习小结几种网络编程方式:ISAPI、CGI、WinInet、Winsock它们之间的区别:1) ISAPI主要是开发基于浏览器客户端与服务器端程序。效率比CGI方式高,而且也扩展了CGI没有的一些功能。(基于TCP/IP模型中的应用层)2) CGI主要是开发基于浏览器客户端与服务器端程序。(基于TCP/IP模型中的应用层)3) WinInet主要是开发客户端程序。(基于TCP/IP模型中的应用层)4) Winsock主要是基于socket来开发客户端与服务器端程序。(基于TCP/IP模型中的各层)要想开发低层协议的程序的话就要了解协议的报文格式。 网络基础知识:网络硬件 数据通讯原理
2、 (详见/source/1196517)OSI七层网络模型与TCP/IP四层网络模型 (详见/topic/thread-396621.html)网络原理和协议 (详见/)Winsock 网络编程:建议,把机械工业出版社出的Windows网络编程技术看N遍后,再利用MFC或者SDK编写一些小的通信例程,然后编写较大规模的网络程序,最后你就明白了网络编程了! Windows网络编程技术专门讨论Windows网络编程技术,覆盖Windows 95/98/NT 4/2000/CE平台。内容包括NetBIOS和Windows重定向器方法、Winsock方法、客户端远程访问服务器方法。本书论述深入浅出、用
3、大量实例详解了微软网络API函数的应用。TCP/IP详解,卷1:协议是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。网络通信编程实用案例精选是一本介绍利用vlsuaIC+进行网络通信程序开发的书籍。书中精选了大量网络实例,涵盖了本地汁算机网络编程、局域网网络通信编程、IE编程、网络通信协议编程、串口通信编程、代理服务器编程和高级网络通信编程ACE:ACE自适配通信环境(ADAPTIVE Communication E/ace_tao/index.html建议在、/网站上找些老外写的网络代码研究研究,最好能参加实际的网络项目,这样能见识更多成熟
4、的网络类库。最好能参加实际的网络项目,这样能见识更多成熟的网络类库。 开源网络封装库 :ACE,ICE,asio,cppsocket,netclass,poco,SimpleSocket,socketman,Sockets 开源下载工具 fdm, eMulePlus,eMule 开源FTP FileZilla 开源服务器 Apache 网游服务器开源框架 GNE,HawkNL,RakNet,SDL_net 网络协议分析软件:Sniffer工具WPE -抓包Ethereal -协议分析 SockMon5 -抓包及错误分析 Windows网络编程细节问题: 1. 如果在已经处于 ESTABLISH
5、ED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(c
6、onst char*)&bDontLinger,sizeof(BOOL); 3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:int nNetTimeout=1000;/1秒/发送时限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int);/接收时限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int); 4.在send()的时候,返回的是实际发送出去的字节(同步)或
7、发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:/ 接收缓冲区int nRecvBuf=32*1024;/设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/发送缓冲区int nSendBuf=32*1024;/设置为32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSen
8、dBuf,sizeof(int);5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero);6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int);7.一般在发送UDP数据报的时候,希望该socket发送的数据具有
9、广播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL);8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const ch
10、ar*)&bConditionalAccept,sizeof(BOOL);9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是从容关闭shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?struct linger u_short l_onoff;u_short l_linger;linger m_sLinger;m_sLinger.l_onoff=1;/(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)/
11、如果m_sLinger.l_onoff=0;则功能和B)作用相同;m_sLinger.l_linger=5;/(容许逗留的时间为5秒)setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger);注意点: A.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;B.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;10.一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:BOOL bDebug=TRUE;set
12、sockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL);11.往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,一般习惯是自己写个处理网络缓冲的类,动态分配内存。 12、#include ,#include冲突问题解决方法:在StdAfx.h 头文件中添加winsock2.h,Afxsock.h先#include 再#include 13、获取数据包,一般来说想获取数据包可以使用IP_HDRINCL选项,但是在Windows 2000/XP中setsockopt()中IP_HDRINCL是个不合
13、法的选项,但是可以使用 WSAIoctl() 函数调用SIO_RCVALL捕获IP数据包。简单步骤如下:1)、Create a raw socket. 2)、Bind the socket to the local IP over which the traffic is to be sniffed. 3)、WSAIoctl() the socket with SIO_RCVALL to give it sniffing powers. 4)、Put the socket in an infinite loop of recvfrom. 5)、n joy! the Buffer from re
14、cvfrom. 14、IP、TCP、UDP、ICMP数据包格式/*The IP header */typedef struct tagIPHEADER unsigned char version:4; unsigned char header_len:4; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sour
15、ceIP; unsigned int destIP;IPHEADER;struct TCPPacketHead WORD SourPort; WORD DestPort; DWORD SeqNo; DWORD AckNo; BYTE HLen; BYTE Flag; WORD WndSize; WORD ChkSum; WORD UrgPtr;struct ICMPPacketHead BYTE Type; BYTE Code; WORD ChkSum;struct UDPPacketHead WORD SourPort; WORD DestPort; WORD Len; WORD ChkSu
16、m; 15、几种winsock I/O模型比较:select模型核心就是select函数,它可用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。这个函数可以有效地防止应用程序在套接字处于阻塞模式中时,send或recv进入阻塞状态;同时也可以防止产生大量的WSAEWOULDBLOCK错误select的优势是能够从单个线程的多个套接字上进行多重连接及I/O。WSAAsyncSelect 模型是以消息机制为基础,能够处理一定的客户连接量,但是扩展性也不是很好。因为消息泵很快就会阻塞,降低了消息处理的速度。WSAAsyncSelect和WSAEventSelect模型提供了读写数据能力的异
17、步通知,但他们不提供异步数据传送,而重叠及完成端口提供异步数据的传送。WSAEventSelect 模型以时间为基础的网络事件通知,但是与WSAAsyncSelect不同的是,它主要是由事件对象句柄完成的,而不是通过窗口。但是一个线程只能等待64个事件(需要开辟多个线程解决),伸缩性不如完成端口。重叠模型可以使程序能达到更佳的系统性能。基本设计原理就是让应用程序使用重叠的数据结构,一次投递一个或多个I/O请求。针对这些提交的请求,在他们完成之后,应用程序可为他们提供服务。它又分为两种实现方法:事件通知和完成例程。重叠I/O模型事件通知依赖于等待事件通知的线程数(WSAWaitForMultip
18、leEvents调用的每个线程,该I/O模型一次最多都只能支持6 4个套接字。),处理客户通信时,大量线程上下文的切换是它们共同的制约因素。完成端口提供了最好的伸缩性,往往可以使系统达到最好的性能,是处理成千上万的套接字的首选。从本质上说,完成端口模型要求创建一个windows完成端口对象,该对象通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。但是完成端口只是支持NT系统、WIN2000系统。重叠模型和完成端口模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序投递了一个10KB大小的缓冲区来接收数据,且数据已经到达套接字,则该数据将直接被
19、拷贝到投递的缓冲区。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,数据到达并拷贝到单套接字接收缓冲区中,此时应用程序会被告知可以读入的容量。当应用程序调用接收函数之后,数据才从单套接字缓冲区拷贝到应用程序的缓冲区,差别就体现出来了。 16、服务器与客户端IO模型选择对于如何挑选最适合自己应用程序的I/O模型已经很明晰了。同开发一个简单的运行多线程的锁定模式应用相比,其他每种I/O模型都需要更为复杂的编程工作。因此,针对客户机和服务器应用开发模型的选择,有以下原则。1). 客户端若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重
20、叠I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如开发的是一个以Windows为基础的应用程序,要进行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一种最好的选择,因为WSAAsyncSelect本身便是从Windows消息模型借鉴来的。采用这种模型,程序需具备消息处理功能。2). 服务器端若开发的是一个服务器应用,要在一个给定的时间,同时控制多个套接字,建议采用重叠I/O模型,这同样是从性能角度考虑的。但是,如果服务器在任何给定的时间,都会为大量I/O请求提供服务,便应考虑使用I/O完成端口模型,从而获得更佳的性能。 17、shutdown、clos
21、esocket区别shutdown 从容关闭,为了保证通信双方都能够收到应用程序发出的所有数据,一个合格的应用程序的做法是通知接受双发都不在发送数据!这就是所谓的“正常关闭”套接字的方法,而这个方法就是由shutdown函数,传递给它的参数有SD_RECEIVE,SD_SEND,SD_BOTH三种,如果是SD_RECEIVE就表示不允许再对此套接字调用接受函数。这对于协议层没有影响,另外对于tcp套接字来说,无论数据是在等候接受还是即将抵达,都要重置连接(注意对于udp协议来说,仍然接受并排列传入的数据,因此udp套接字而言shutdown毫无意义)。如果选择SE_SEND,则表示不允许再调用
22、发送函数。对于tcp套接字来说,这意味着会在所有数据发送出并得到接受端确认后产生一个FIN包。如果指定SD_BOTH,答案不言而喻。 closesocket 正式关闭,关闭连接,释放所有相关的资源。因为无连接协议没有连接,所以不会有正式关闭和从容关闭,直接调用closesocket函数。 18、TCP链接三次握手、终止链接四次握手 19、getpeername 、getsocknamegetpeername 函数用于获得通信方的套接字地址信息,该信息上关于已建立连接的那个套接字的。getsockname 函数是getpeername的对应函数。它返回的是指定套接字的本地接口的地址信息。 20、
23、MFC下CSocket编程注意事项1)、在使用MFC编写socket程序时,必须要包含都文件。2)、AfxSocketInit() 这个函数,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错。3)、CSocket:Create 的接口就是, 实现上还执行了 CSocket:Bind , 非常不容易被发现。如果是以 Create 方法初始化的前提下不能再调用 Bind ,要不一定出错。一般写服务器程序都不要用Create 为好,用下面的 CSocket:Socket 初始化然后Bind。 21、winsock 有两个不同的版本winsock 有两个不同的版本,第一版很old
24、了,win95时代的,win2000后推崇第二版winsock 2, 出了主板本号外,还有子版本号,这些功能上有差别,winsock2 支持原始套接字编程, MFC 还封装了winsock,使用WINSOCK.h 要用到WSOCK32.LIB, 还有一些扩展api功能,需要MSWSOCK.h MSWSOCK.DLL 。 现在winsock.h winsock2.h 都用ws2_32.lib。 22、sockaddr_in , sockaddr , in_addr区别struct sockaddr unsigned short sa_family; char sa_data14; ; 上面是通用
25、的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 struct sockaddr_in short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; ; struct in_addr就是32位IP地址。 struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S
26、_addr; S_un; #define s_addr S_un.S_addr ; inet_addr()是将一个点分制的IP地址(如)转换为上述结构中需要的32位IP地址(0 xC0A80001)。填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。通常的用法是: int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度教育机构教师人力资源派遣合同
- 二零二五年度个人手车交易绿色环保认证协议
- 二零二五年度交通事故车辆损失评估及自行协商协议书
- 2025年度美甲店线上线下融合推广合作协议
- 2025年度高新技术产业挂名股东投资协议书
- 二零二五年度城市核心区租赁住宅及子女入学协议
- 二零二五年度专业仓储物流停车场租赁合作协议
- 2025年度班组劳务分包合同终止及清算协议
- 二零二五年度劳动合同终止证明书模板与案例分析
- 2025年度电商代运营服务与品牌形象塑造合同
- 广东省2025届高考数学一模试卷含解析
- 通风空调系统单机调试方案
- 2025天津经济技术开发区管委会事业单位招聘37人历年管理单位笔试遴选500模拟题附带答案详解
- 【MOOC】大学体育-华中科技大学 中国大学慕课MOOC答案
- 品管圈PDCA大赛作品-普外科提高腹腔镜术后24小时内肠道通气率医院品质管理案例
- 职业生涯规划书高中生课件
- 6.环境保护及文明施工监理措施
- 建筑结构工程师招聘笔试题与参考答案(某大型央企)2024年
- 早产儿视网膜病预防管理专家共识(2024)解读
- 电动托盘车安全培训
- 单位不交社保仲裁申请书范文6
评论
0/150
提交评论