Socket编程笔记一:网络应用程序的概念

 

网络应用程序设计,最基本的两个问题是:通信的进程如何相互识别双方采用怎样的方式进行联系

什么是网络应用程序?

 

应用程序可以简单地分为:

无通信应用程序

通信的应用程序(网络应用程序

 

进程间通信的问题可以分为两种:

单击系统的进程通信。消息、信号量、共享存储区。

不同系统的进程。网络通信协议

 

网络应用程序的识别问题

 

半相关:为了唯一地标识网络中通信的一个进程,即通信一方,就要使用一个如下的三元组:

(本地协议,本地IP地址,本地端口号)

相关:一个五元组可以唯一标识网络中两个通信的进程或一条连接

(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)

 

网络程序联系的模型:客户/服务器

 

服务器的分类:

串行服务器:服务器只有一个进程用串行的方式对客户地请求提供服务;

并发服务器:服务器可以为分别每个客户请求创建进程或线程并提供服务;

 

服务器特点:

1.          服务进程一般在启动后就一直运行,以等待客户请求的到来,除非服务被禁止或执行强迫终止服务程序。

2.          服务器方进程使用的是众所周知的端口,否则客户无法知道提供服务的端口

3.          服务器方通常拥有较多的资源。

4.          服务器方进程可以并行处理多个客户的请求,但可以同时处理的客户请求数目是有一定限制的

5.          服务器方在通信时属于被动的一方。

 

客户方:

1.          需要服务时向服务器提出请求,请求的服务得到满足并完成处理任务后,就终止客户程序的执行

2.          使用向系统申请的临时端口与服务器方进程进行通信。

3.          拥有相对较少的资源。

4.          客户方在通信时属于主动的一方。

 

 

 

 

Socket编程笔记二:Tcp/ip应用程序工作模型与网络编程接口

Tcp/ip协议的核心内容被封装到操作系统中,系统提供网络编程接口Windows Sockets用于网络程序设计。

Tcp/ip应用程序工作模型

 

客户应用程序  --------------------------服务器应用程序

     |                            |

网络编程接口-  --------------------------网络编程接口

     |                            |

TCP/IP核心协议 ------------------------ TCP/IP核心协议

     |                            |

物理传输介质  -------------------------- 物理传输介质

 

用户在进行TCP/IP程序设计时,最关键的问题是要熟悉所用平台提供的网络编程界面API

 

网络编程接口Winsock

 

Winsock的版本:

1.         Winsock1.1 16位,由Winsock.dll支持

2.         Winsock2.2 32位,由Wsock32.dl支持l

 

WinsockAPI函数分类:

1.         BSDSoketUnix)相兼容的基本函数

2.         网络数据信息检索函数

3.         Windows专用扩展函数

 

Socket编程笔记三:套接口的概念与其编程原理

 

套接口Soket

 

程序A——套接口——网管软件——网卡      网卡——网管软件——套接口——程序B

 

若不考虑通信过程中的网络接口卡和传输介质等,则网络通信的过程就是由数据的发送者将要发送的信息写入一个套接口,再通过中间环节将信息传输到接收端的套接口中,然后就可以由接收端的应用程序将信息从套接口中取出。因此两个程序之间的数据传输要通过套接口来完成。

套接口的本质:就是通信过程中所要使用的一些缓冲区及一些相关的数据结构。

 

套接口的分类:

1.         流式套接口(SOCK_STREAM;Tcp协议实现字符流的传输

2.         数据套接口(SOCK_DGRAMUDP协议

3.         原始套接口(SOCK_RAW);底层协议

 

 

套接口的编程原理

 

服务器

Socket()开启服务——bind()绑定端口——listen()监听请求——accept()接受请求——recv()接收数据——send()发送数据——closesocket()关闭套接口

客户方

Socket()请求服务——connect()连接服务器——closesocket()关闭套接口

 

错误处理机制

 

不成功的Winsock函数调用返回的最常见的值是宏定义SOCKET _ERROR,在 Winsock的头文件中( Winsock2.h),它的数值是-1,实际上如果调用一个Winsock函数时发生了错误,则应该进一步使用WSAGetLastError()函数,以获得对这一错误详细说明。该函数的使用非常简单,格式如下:

  Int WSAGetLastError(void)

这是一个无参函数,调用时返回最新发生的网络错误代码。

 

网络字节顺序

 

小序在前:在起始地址处存放整数的低序号字节。主机字节顺序

大序在前:在起始地址处存放整数的高序号字节。网络字节顺序

Winsock中有一系列的函数可用于多字节的转换,把它们从主机字节顺序转换成网络字节顺序。

htonl()                ntohl()

WSAHtonl()            WSANtohl()

htons()                ntohs()

WSAHtons()            WSANtohs()