基本通信模型

 

·概要:

    所谓的基本通信模型是指SOCKET通信。这里介绍的是初期学习使用的一些SOCKET相关概念和接口使用情况。

    SOCKET编程也跟平台有关:linux等平台使用的是标准SOCKET--又称Berkeley Socket;windows平台的Winsock。

 

·要点:

--基础:

    Socket实际上是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制。其中IP用于定位通信的计算机,而端口则可以定位到通信的进程。这跟电话很像:IP+Port相当于电话号码,只要知道电话号码就可以给其他人打电话了。

    常用的TCP/UDP则是具体的通信方法(协议),这些是已经成熟并被完整实现的技术,所以使用的使用只要指定是采用TCP还是UDP方式就好。同时在这两种协议上发展了很多应用协议,TCP之上的FTP/SMTP/TTP/HTTP,UDP之上的TFTP和广播技术。

    一个网络连接需要的信息:本地主机地址+本地协议端口(怎么找到我)、远程主机地址+远程协议端口(怎么找到你)和协议(打电话还是发短信)。

 

--相关函数和数据结构(以TCP为例):

数据结构:

    socket作为整个通信的基础在linux平台定义为INT类型,而在windows平台则定义为:SOCKET socket{int af(协议族),int type(类型),int protocol(协议地址)};同时在内部定义了协议,可直接使用。

    通信中的IP和端口等信息被包含在一个表示地址的数据结构中,windows平台定义为struct sockaddr_in{sort sin_family;u_short sin_port,struct in_addr sin_addr;char sin_zero[8]};的数据结构。

 

主函数:

    向系统申请SOCKET资源的socket函数和相关的释放socket资源函数;

    作为客户端的主动连接函数connect函数;

    服务器端配置函数bind(绑定IP和端口)和listen(设置缓存队列长度);

    服务器端主函数accept函数--用于接受客户端连接请求;

    相关的读写函数send和recv两个函数—linux还有write/read等。

IP地址转换:

    整数地址与ASCII地址(如"192.168.16.182")之间的转换函数:

         int inet_aton(const char* straddr,struct in_addr* adrp);

         char* inet_ntoa(struct in_addr inaddr);

         in_addr_t inet_addr(const char* cp);

    域名和整数地址的转换函数:

     struct hostent* gethostbyname(const char* name);

     struct hostent* gethostbyaddr(const char* addr,int len,int family);

字节序列转换:

    首先需要理解的是不同的存储字节的格式:BigEndian(网络)和LittleEndian。

    相关转换函数:

        u_long htonl(u_long hostlong);

        u_short htons(u_short hostshort);

        u_long ntohl(u_long netlong);

        u_short ntohs(u_short netshort);

 

--常用通信模型:

    客户端:

     初始化Socket--建立连接--收发数据--关闭连接;

    服务器端:

     初始化监听Socket(包含bind和listen)--接受新连接--收发数据--关闭连接;

    对于服务器端,在{接受新连接--收发数据}形成一个循环就可以作为简单的服务器模型了。同时也可以对{接受新连接--收发数据}进行扩展就可扩展出很多的通信模型来。

 

--UDP通信:

    UDP相比于TCP使用的接口函数少,这跟UDP内部的工作原理有关。

 

·小结:

    很多的通信库都会对相关的数据结构概念和函数接口进行封装,来实现跨平台;

posted on 2012-04-16 11:56  格物志  阅读(630)  评论(0编辑  收藏  举报

导航