前面两篇看socket的入门一些知识还有一些常用的API,现在来解释一些概念,还有就是tcp和udp客户端服务器基本模式!
阻塞和非阻塞
套接字可以处于阻塞模式或者非阻塞模式,调用任何一个阻塞模式的函数都会产生同样的结果。(用或长或短的时间等待操作的完成) 当套接字处于非阻塞模式的时候,API函数的调用会立即返回,但是大多会失败,返回WSAEWOULDBLOCK错误。意味着请求操作在调用期间没有时间完成。
举个例子,阻塞就是当你拨打我的电话的时候,我不在,于是你拿电话等我回来,这期间不能再用电话了。
非阻塞就是你拨打我的电话,但是我不在,这时你挂断了电弧啊,待会再打,至于我是不是在,只有打了电话才知道。
在32位系统中,可以采用多线程的方法,在不同的县城中使用套接字,这样即使某个线程中的套接字被阻塞也不会影响应用程序的其他操作,同时也不会再阻塞线程上耗费CPU时间。
字节序
不同的计算机中用不同的字节顺序存储数据。
任何从winsock函数对IP地址和端口号的引用和传送给winsock函数的IP地址和端口号均是按照网络顺序组织的,这也包括了sockaddr_in这个数据结构中的IP地址域和端口域,但是不包括sin_family域。
广播一个应用程序通常用与’时间‘服务对应的端口来和服务器连接,而服务器提供某种机制来通知用户使用另一端口,因此getservbyname函数返回的端口号已经是网络顺序了。可以直接用来组成一个地址,不需要进行转换。
如果用户输入一个数,而制定使用这一端口号,应用程序则必须在使用它建立地址以前把它从主机顺序转换成网络顺序。相应的,如果应用程序希望显示包含于某一地址中的端口号,则这一端口号就必须在被显示前从网络地址顺序转换到主机顺序。
数据报套接字可以用来向许多系统支持的网络发送广播数据包。网络上必须先要支持广播功能。
发送广播数据包的能力被限制于那些用显示标记了允许广播的套接字中,分为以下情况:
1、一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址没有任何检验。
2、一些重要的功能,如:路由要求把他们的信息发送给所有可以找到的邻机。
被广播的信息的目的地址取决于这一信息将在何种网络上广播。由于使用广播以前必须捆绑一个数据报套接字,所以所有受到的广播消息都带有发送者地址和端口。
客户端/服务器模型
1、TCP面向连接
(1)、服务器进程创建套接字
(2)、将本地地址绑定到所创建的套接字上,以使在网络上标识该套接字。
(3)、将套接字置入监听模式并准备接受连接请求。
(4)、客户端进程调用socket函数创建客户端套接字.
(5)、客户想进程发送链接请求
(6)、当连接请求到来后,被阻塞的服务进程的accept函数生成一个新的套接字于客户套接字建立连接。
(7)、一旦客户端的套接字受到来自服务器的接受信号,表示客户与服务器已实现连接,可以进行数据传输了。
下面看图:
2、UDP数据报套接字模型
(1)、建立套接字
(2)、通过bind函数绑定这个套接字和准备棘手数据的IP
(3)、不要再调用listen和accept了,只要等待数据。
(4)、接受发送数据
下面看图:
下一篇将给出代码和讲解;
2012/8/15
jofranks 于南昌