`
阅读更多

 

转自:http://blog.csdn.net/byxdaz/archive/2009/08/29/4496575.aspx

 

几种网络编程方式:

ISAPI、CGI、WinInet、Winsock

它们之间的区别:

1)  ISAPI主要是开发基于浏览器客户端与服务器端程序。效率比CGI方式高,而且也扩展了CGI没有的一些功能。(基于TCP/IP模型中的应用层)

2)  CGI主要是开发基于浏览器客户端与服务器端程序。(基于TCP/IP模型中的应用层)

3)  WinInet主要是开发客户端程序。(基于TCP/IP模型中的应用层)

4)  Winsock主要是基于socket来开发客户端与服务器端程序。(基于TCP/IP模型中的各层)要想开发低层协议的程序的话就要了解协议的报文格式。

 

网络基础知识:

网络硬件

数据通讯原理 (详见http://download.csdn.net/source/1196517)

OSI七层网络模型与TCP/IP四层网络模型 (详见http://bbs.51cto.com/topic/thread-396621.html

网络原理和协议 (详见http://www.cnpaf.net/

Winsock

 

网络编程:

建议,把机械工业出版社出的《Windows网络编程技术》看N遍后,再利用MFC或者SDK编写一些小的通信例程,然后编写较大规模的网络程序,最后你就明白了网络编程了!

 

《Windows网络编程技术》专门讨论Windows网络编程技术,覆盖Windows 95/98/NT 4/2000/CE平台。内容包括NetBIOS和Windows重定向器方法、Winsock方法、客户端远程访问服务器方法。本书论述深入浅出、用大量实例详解了微软网络API函数的应用。

《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。

《网络通信编程实用案例精选》是一本介绍利用vlsuaIC++进行网络通信程序开发的书籍。书中精选了大量网络实例,涵盖了本地汁算机网络编程、局域网网络通信编程、IE编程、网络通信协议编程、串口通信编程、代理服务器编程和高级网络通信编程.

RFC文档目录:http://oss.org.cn/man/develop/rfc/default.htm

ACE:ACE自适配通信环境(ADAPTIVE   Communication   Environment)是可以自由使用、开放源码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++  Wrapper   Facade(包装外观)和框架组件,可跨越多种平台完成常见的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。ACE资料参考:http://docs.huihoo.com/ace_tao/index.html

建议在www.codeproject.comhttp://www.codeguru.com/网站上找些老外写的网络代码研究研究。

 

网络协议分析软件:

Sniffer工具

Wireshark(Ethereal)

WPE

 

 

Windows网络编程细节问题:
    1. 如果在已经处于 ESTABLISHED状态下的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,(const 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()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:

  // 接收缓冲区

  int nRecvBuf=32*1024;//设置为32K

  setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

  //发送缓冲区

  int nSendBuf=32*1024;//设置为32K

  setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,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发送的数据具有广播特性:

  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 char*)

&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()调用,但是还有数据没发送完毕的时候容许逗留)

  // 如果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;

  setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));

  11.往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,一般习惯是自己写个处理网络缓冲的类,动态分配内存。

    12、#include <Afxsock.h>,#include<winsock2.h>冲突问题

解决方法:在StdAfx.h 头文件中添加winsock2.h,Afxsock.h

先#include <winsock2.h> 再#include <Afxsock.h>

    13、获取数据包,一般来说想获取数据包可以使用IP_HDRINCL选项,但是在Windows 2000/XP中setsockopt()中IP_HDRINCL是个不合法的选项,但是可以使用 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 recvfrom.

    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 sourceIP;
 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 ChkSum;
};

 

    15、几种winsock I/O模型比较:
select模型核心就是select函数,它可用于判断套接字上是否存在数据,或者能否向一个套接字写入数据。这个函数可以有效地防止应用程序在套接字处于阻塞模式中时,send或recv进入阻塞状态;同时也可以防止产生大量的WSAEWOULDBLOCK错误select的优势是能够从单个线程的多个套接字上进行多重连接及I/O。

WSAAsyncSelect 模型是以消息机制为基础,能够处理一定的客户连接量,但是扩展性也不是很好。因为消息泵很快就会阻塞,降低了消息处理的速度。WSAAsyncSelect和WSAEventSelect模型提供了读写数据能力的异步通知,但他们不提供异步数据传送,而重叠及完成端口提供异步数据的传送。

WSAEventSelect 模型以时间为基础的网络事件通知,但是与WSAAsyncSelect不同的是,它主要是由事件对象句柄完成的,而不是通过窗口。但是一个线程只能等待64个事件(需要开辟多个线程解决),伸缩性不如完成端口。

重叠模型可以使程序能达到更佳的系统性能。基本设计原理就是让应用程序使用重叠的数据结构,一次投递一个或多个I/O请求。针对这些提交的请求,在他们完成之后,应用程序可为他们提供服务。它又分为两种实现方法:事件通知和完成例程。重叠I/O模型事件通知依赖于等待事件通知的线程数(WSAWaitForMultipleEvents调用的每个线程,该I/O模型一次最多都只能支持6 4个套接字。),处理客户通信时,大量线程上下文的切换是它们共同的制约因素。

完成端口提供了最好的伸缩性,往往可以使系统达到最好的性能,是处理成千上万的套接字的首选。从本质上说,完成端口模型要求创建一个windows完成端口对象,该对象通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。但是完成端口只是支持NT系统、WIN2000系统。

重叠模型和完成端口模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序投递了一个10KB大小的缓冲区来接收数据,且数据已经到达套接字,则该数据将直接被拷贝到投递的缓冲区。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,数据到达并拷贝到单套接字接收缓冲区中,此时应用程序会被告知可以读入的容量。当应用程序调用接收函数之后,数据才从单套接字缓冲区拷贝到应用程序的缓冲区,差别就体现出来了。

 

    16、服务器与客户端IO模型选择

对于如何挑选最适合自己应用程序的I/O模型已经很明晰了。同开发一个简单的运行多线程的锁定模式应用相比,其他每种I/O模型都需要更为复杂的编程工作。因此,针对客户机和服务器应用开发模型的选择,有以下原则。

1). 客户端

若打算开发一个客户机应用,令其同时管理一个或多个套接字,那么建议采用重叠I/O或WSAEventSelect模型

,以便在一定程度上提升性能。然而,假如开发的是一个以Windows为基础的应用程序,要进行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一种最好的选择,因为WSAAsyncSelect本身便是从Windows消息模型借鉴来的。采用这种模型,程序需具备消息处理功能。

2). 服务器端

若开发的是一个服务器应用,要在一个给定的时间,同时控制多个套接字,建议采用重叠I/O模型,这同样是从性能角度考虑的。但是,如果服务器在任何给定的时间,都会为大量I/O请求提供服务,便应考虑使用I/O完成端口模型,从而获得更佳的性能。

    17、shutdown、closesocket区别

shutdown 从容关闭
closesocket 正式关闭,关闭连接,释放所有相关的资源。因为无连接协议没有连接,所以不会有正式关闭和从容关闭,直接调用closesocket函数。

    18、TCP链接三次握手、终止链接四次握手

 

 

 

 

    19、getpeername 、getsockname

getpeername 函数用于获得通信方的套接字地址信息,该信息上关于已建立连接的那个套接字的。
getsockname 函数是getpeername的对应函数。它返回的是指定套接字的本地接口的地址信息。


 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/byxdaz/archive/2009/08/29/4496575.aspx

分享到:
评论

相关推荐

    TCP/IP网络编程课件,关于网络编程的详细介绍。

    TCP/IP网络编程课件,关于网络编程的详细介绍。

    关于网络编程和协议(pdf)

    关于网络编程和协议学习资料 相关的实例 pdf格式

    关于网络编程和协议3(pdf)

    关于网络编程和协议学习资料 相关的实例 pdf格式

    呵呵关于网络编程的一些棘手问题

    呵呵关于网络编程的一些棘手问题,关于网站登录和修改密码的后台程序

    网络编程实用教程(第二版)-源代码-叶树华

    《网络编程实用教程(第二版)》是叶树华撰写的一本关于网络编程的经典教材,主要面向初学者和有一定基础的开发者,旨在帮助读者深入理解网络编程的基本原理和实际应用。书中涵盖了网络通信的基础概念、协议、编程接口...

    Windows网络编程.pdf

    Windows 网络编程 概述 Windows 网络编程是指在 Windows 操作系统平台上进行网络编程的技术,涉及到 Windows Socket、网络协议、网络应用程序的开发等方面。 Windows 网络编程的主要目的是实现高性能的网络应用...

    TCP IP网络编程

    扫描版 超清百度网盘资源!!! 为初学者准备的网络编程! 韩国TCP/IP经典教程!... 本书针对网络编程初学者,面向具备C语言基础的套接字网络编程学习者,适合所有希望学习Linux和Windows网络编程的人。

    C++网络编程文档

    C++网络编程是计算机科学中的一个重要领域,它允许开发者创建能够通过网络进行通信的应用程序。这份"C++网络编程文档"涵盖了这一主题的广泛内容,旨在帮助程序员深入理解并掌握网络编程的基本概念和技术。 首先,...

    Windows 网络编程技术 pdf格式

    《Windows网络编程技术》这本书是IT领域中关于网络编程的一部重要参考资料,主要涵盖了Windows操作系统环境下进行网络应用程序开发的各种技术和实践。以下是对该书主要内容的详细解析: 一、网络编程基础 在Windows...

    c++网络编程实例.pdf

    C++ 网络编程实例 本文档提供了 C++ 网络编程的基础知识,涵盖了网络编程的概述、OSI 七层网络模型、TCP/IP 协议和 C/S 编程模型等内容。 网络编程概述 网络编程是指用户使用 MFC 类库在 VC 编译器中编写程序,以...

    网络编程基础教学文件

    关于网络编程基础知识学习教学文件,章节有网络编程概述、网络相关术语、网络分层体系结构、即时通信的三种模式、C# Socket通信过程、WebSocket 编程。内容知识点设计网络编程基础、OSI/RM、TCP/IP模型、Socket网络...

    Java网络编程案例教程习题参考答案 .pdf

    Java网络编程案例教程习题参考答案 Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程...

    网络编程之发送结构体.zip

    网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体...

    嵌入式网络编程PPT教案.pptx

    教材选用《计算机网络编程与数据通信》等书籍,并参考多本关于网络编程的专业著作,如《计算机网络:自顶向下方法》、《UNIX网络编程卷1:套接字联网API》(第3版)、《Linux网络编程》、《Windows网络编程》以及GSM...

    unix网络编程三卷合一中文版

    在计算机网络编程领域,Unix系统无疑占据着举足轻重的地位。它以其强大的网络功能、稳定的性能和跨平台的特点,吸引了无数程序员和研究者深入探索其内部机制。《Unix网络编程》作为该领域内的一部经典著作,由W. ...

    java网络编程第四版pdf

    《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...

    Visual C++网络编程案例实战.pdf

    《Visual C++网络编程案例实战》一书深入探讨了如何利用Visual C++及MFC类库进行网络编程,尤其强调了Windows Socket的应用。本书不仅覆盖了理论基础,还提供了丰富的实践案例,帮助读者掌握网络编程的核心技能。 #...

    Java网络编程实验报告.pdf

    "Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...

    网络技术网络基础 网络编程 网络基础

    网络基础 网络编程 网络基础 网络基础 网络编程 网络基础 网络基础 网络编程 网络基础 网络基础 网络编程 网络基础

Global site tag (gtag.js) - Google Analytics