网络编程 总结

[TOC]

基于windows的网络编程

原理

通过api函数,然后为每个用户连接注册一个socket,socket协议栈自动为用户分配两个缓冲区接受缓冲区,发送缓冲区
sock_stream:流套接字 tcp使用
sock_dgram:数据包套接字,udp协议
sock_ram:原始套接字,可读写内核中没有处理的ip包,使用其他协议可自定协议

  • 阻塞模式:在 调用接受函数是,如果没有数据到达,此函数会一直等待(在windows中,对于不能立即完成的阻塞操作,DLL初始化->循环操作,在循环中 接受/发送win消息,检查调用是否完成,是否超时)
  • 非阻塞模式:套接字设置非阻塞,多次调用接受函数,前三次调用时,内核数据还没准备好,因此,该函数;立即返回WSAEWOULDBLOCK错误,第四次调用时,数据准备好,被复制到应用缓存区(异步通信模式,无须创建一个新的线程)
    基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的
    客户机/服务器模型:

  • 客户机/服务器(C/S)网络的信息服务系统通常由计算机平台、网络平台和数据库平台组成。这里的C/S信息系统,在硬件条件不变的情况下,根据其作用可划分为几个部分:1、第一部分为前端,即客户机。前端是一个运行在客户机上并向服务器发送信息,并接收服务器信息的小型应用程序,因此,前端实际就是服务器上应用程序的一个接口。2、第二部分为后端,即服务器。后端计算机上应当 运行基于C/S模式的后台程序,如SQL Server。服务器程序可以应用于各类计算机平台上,从微机、小型机直到大型计算机。随着计算机网络规模的发展,网络中可能需要不只一个服务器来分别处理各种客户机的请求。为此,可以在同一台服务器上安装多种应用服务软件。当网络上客户机对电子邮件的服务请求不多时,还可以安排它兼做其他客户机或者服务器使用。3、第三部分为连接件,即起连接作用的软件和硬件。其中软件连接主要包括网络协议,网络应用接口和数据库的连接接口等,而硬件连接主要有网卡和通信介质等


winsock原理

windows下的socket编程接口,,充分利用Windows的消息驱动机制编程。

getXbyY( )形式的数据库例程都返回一个指针,指向某种类型的结构区域,用来存放函数返回的数据信息。.一共六个,只是查询,不会写改,在该线程下有用,不会跨域查询
微软对基本的socket编程提供了消息驱动的机制的支持,有效利用了windows多任务多线程的机制(这些扩展函数是以WSA开头的后面跟async表示为异步实现的 WSAStarup,WSACleanup())
Winsock
WinSock 2.0规范: (1)支持多种协议(2)引用了重叠I/O(3)使用事件对象异步通知(4)服务的质量(QOS)(5)套接口组(6)扩展的字节顺序转换例程(7)分散/聚集方式I/O(8)新增了许多函数。
#include<winsock2.h> #pragma comment(lib,"WS2_32")//Ws2_32.lib 添加此引用
int WSAStartup(WORD wVersion,LPWSADATA); wversionRequested参数用来指定想要加载的winsock库的版本,可以使用宏MAKEWORD(x,y)建立,x高字节,y低字节

  • select:在非阻塞模式下,winSock函数无论如何都会立即返回,要防止无功而返.select模型是winSock中常见的I/O模型.它是非阻塞的,对read,write,execpt三种事件进行检查
  • WSAAsyncSelect模型:windows特有的,设置非阻塞模式,并向windows注册网络事件IEvent,和提供通知时使用的窗口句柄hWnd.
  • WSAEventSelect模型:与事件对象关联的,为感兴趣的一组网络事件创建一个事件对象,再调用WSAEventSelect函数将网络事件和事件对象关联.当网络事件发生时,winsock使响应的事件受信,等待函数就会被立即返回.一般调用WSAEnumNetworkEvents可以获得到底发生了什么网络事件(FD_READ/ FD_ACCEPT/ FD_CLOSE).
  • winsock2扩展
    • 原始套接字(sock_ram)下的扩展,Overlapped I/O:异步I/O(系统完成I/O后,发消息通知给应用程序,由内核对象(hand),事件内核对象(hEvent),异步过程调用(apcs)和端口)该模型是os直接将数据放到应用缓冲区中,其他是在套接字缓冲区中,在通知应用接受后,应用才从缓冲区接受
  • 套接字选项和I/O控制命令:getSockopt 获取套接字选项 setsockopt设置,ioctsocket IO控制,WSAIoctl 扩充的IO控制
  • WInInet网络编程,使用HTTP,FTP,Gopher实现相关网络编程:
    普通WinIent处理函数 InternetAttemptConnnect 建立Internet连接 // HttpOpenRequest打开一个HTTP请求// FtpCreateDirectory在Ftp服务器新建目录等
    大致过程如下:1)创建CInternetSession对象,并将此对象与服务器连接,queryOption或SetOption请求选项4)OnStatusCallback查询当前数据处理进行信息,5)CInternetFile获得服务器数据,6)read或write

多线程与异步套接字编程

  • 线程:进程中执行运算的最小单元在windows中,线程是指系统中最小的功能执行单元,其可以独立的完成某一项功能。
  • 进程:是系统分配资源的单位,;
    邮槽是windows提供的一种单向通信的机制,一方只能写入或读取数据,另一方只能执行相反的操作.但传输的数据非常小

  • 设置I/O模式

int WSAAsyncSelect (
  SOCKET s,
  HWND hWnd,
  unsigned int wMsg,
  long lEvent
);

网络编程

gethostname():把本地主机名存放入由name参数指定的缓冲区中,返回的主机名是一个以NULL结尾的字符串.没错误返回0,否则返回SOCKET_ERROT,使用WSAGetLastError来得到一个特定的错误代码,错误代码如下:
– WSAEFAULT 名字长度参数太小。
– WSANOTINTIALISED 在应用这个API前,必须成功地调用WSAStartup()
– WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误
– WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行
gethostbyname():返回对应于给定主机名的包含主机名字和地址信息的hostent指针.结构和gethostaddr()相同.
系统扩展:GetAdaptersInfo:使用GetAdaptersInfo获取网卡详细信息()包含包括:Adapter Name,Mac,Ip,NetMask,NetGate);

IP配置信息管理

GetNetworkParams():获取本地计算机的网络参数 返回Info:一个指向缓冲的指针,包含一个FIXED_INFO结构,pOUtBufLen[in] 指向一个ULONG变量的指针,指定FIXED_INFO结构的大小.
GetNumberOfInterfaces(PDWORD pdwNumIf):获得本地计算机网络接口数量
DWORD GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable, PULONG dwOutBufLen );获取本地主机名、域名和DNS服务器信息的函数
GetIfEntry():取一个特定Index接口的信息,

ARP工作原理

ARP是地址转换协议,完成IP地址到MAC地址的转换,在局域网中的两台计算机之间的通信,(在局域网中两台计算机之间的通讯,或者局域网中的计算机将IP数据报转发给网关的时候,网卡都需要知道目标计算机的物理地址);广域网,以太网外部传输就不要了
当ARP广播到来时,ARP协议软件还是会把其中的物理地址与IP地址的映射记录下来.记录有时效性,超过时间就删除
GetIpNetTable

SMTP和POP3协议


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注