我们在设计每一对网络应用程序时,都要让他们按照顺序执行互补的网络操作,而不是同时执行。服务器的应用程序首先启动,然后等待接收信息;客户端程序后启动,并发送第一个网络数据包。在经过了双方的第一次通信后,应用程序所提供的服务能够在任意时刻改变两者的相对关系。
对于两个分别作为客户端和服务器进行通信的socket来说,它们必须是同一种socket类型。两个socket要么都必须是流(TCP)类型,要么都必须是数据报(UDP)类型。客户端应用程序必须能够定位和识别一个服务器的socket,服务器应用程序通过对自己的socket命名来建立身份识别,这样客户端能够引用它。一个TCP/IP的socket名称包含ip的地址、端口号和协议。
所有网络应用程序都可以缩减为五个简单步骤:
*打开socket;
*命名socket;
*与另一个socket建立关联;
*在socket之间发送和接收数据;
*关闭socket;
客户端和服务器都需要通过socket来访问网络,打开socket需要调用socket()函数:
SOCKET PASCAL FAR socket( int af , /* protocol suite */
int type, /* protocol type */
int protocol); /* protocol name */
af:“地址族”,否则视为socket域; PF_INET (TCP/IP)
type:socket类型;SOCK_DGRAM(UDP) SOCK_STREAM(TCP) SOCK_RAW
protocol:所采用的协议。 (tcp/udp)忽略protocol的值,但是把它设为0是一个好习惯 ; SOCK_RAM时,不再有默认值,需要自己指定协议各字段的值。
服务器应用程序必须对其socket进行命名,如果服务器程序没有对其socket命名,协议栈将拒绝客户端的通信请求。构成socket名称的有三个属性,协议、端口号和地址。所以服务器必须为socket分配这三个属性,客户端必须引用这三个属性,客户端和服务器才能通信。