设为首页收藏本站

无忧开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索

[网络编程] 解开网络编程的神秘面纱(二)

[复制链接]
王先森 发表于 2015-4-21 15:59:08 | 显示全部楼层 |阅读模式

大家好,欢迎大家再次走进凌阳教育公众平台并阅读网络编程教学部分,上期的文章中,向大家简单的介绍了一些在学习网络过程中经常遇到的一些名词,并简单对网络学习做了一个小小的概述。从今天起,我们要来点的真材实料的内容了,具体给大家讲一讲网络应用程序是怎么开发的。
       对于网络中的应用程序来讲,除了要考虑应用程序本身需要什么具体功能,还要构思网络应用程序间该怎么进行通信。前边我们提到,网络协议栈分为4层,分别是链路层,网络层,传输层以及应用层,应用程序就处于应用层,要想实现网络应用程序间的通信必须要经过传输层把相应的数据传递出来。所以在介绍具体的应用程序该怎么开发之前,需要对传输层的知识有一个简单的了解。
        传输层,提供进程间的数据传送服务,即端对端的逻辑通信服务,在TCP/IP协议族中有两个互相不同的通信协议:UDP(用户数据报协议)和TCP(传输控制协议),他们完成网络上端对端的数据通信,关于TCP我们选择暂时先撇到一边,因为这不是本期需要关注的内容,我们本期的猪脚是:UDP协议,所讲的内容也是UDP编程。
        UDP(用户数据报协议)是一种面向无连接的协议,它为应用层提供非常简单的服务,负责把数据报的分组从一台主机发送到另一台主机,但是并不保证数据能够到达另一端。这里所说的无连接是指通信的双方并不需要维持任何的状态,如果应用程序通过UDP通信时,那么它就不需要有任何的状态。我们一般将寄信或者是发邮件作为UDP通信的模型,简单的讲,就像平时写信一样,写上对方的信息,把邮件投递出去,后边的出现任何的问题就不是寄信方所负责的了,不管信有没有丢失、损坏都与寄信方无关。UDP也一样,我们添加上一些网络中的标识信息,比如IP、端口等,把UDP数据发送出去就可以了,数据传送不到或者说是损坏不是UDP能够负责的,这要靠应用程序来完成检测以及别的信息,现在我们只需要明白,UDP可以完成应用程序间通信的需求,但是它不是很可靠,有可能会丢失。
        无论是今天要讲的UDP还是后边要说的TCP,在应用程序的设计中,大多采用C/S架构。C即client(客户端),S为server(服务器),也就是客户端与服务器的架构模式。在通信过程中,往往是client首先向等待请求的server发出服务请求,server收到服务请求后提供相应的服务。我们今天主要讲的是UDP的客户端和一些不太引人注意却与网络编程息息相关的内容。
        学过系统编程相关知识的读者肯定对进程间通信的方式印象深刻,好像我们的整个过程都是围绕这个进行讲解的,管道、消息队列、共享内存等等,本机的进程想要通信,一般就是用这些方式,进程调用这些函数,创建对应的通信方式,同时会有相应的返回值(文件描述符),对这些返回值进行操作就能完成对我们创建的通信方式的操作。对于网络上的进程,我们同样有它自己的通信方式--套接字,它主要是解决不同主机进程间的通信问题。类似于管道一样,有相应的函数帮助我们创建这个套接字,即socket函数,调用socket函数会生成一个用于不同主机间通信的通路,同时返回一个文件描述符代表着这条通路,我们将来的通信需要对这个文件描述符进行一系列的操作。
         socket函数:int socket(intfamily ,int type, int protocol);
        具体功能:创建一个用于网络通信的socket套接字。
        参数:family:协议族。在IPV4下,我们选择AF_INET;
                   type:套接字的类别。UDP的为SOCK_DGRAM,TCP为SOCK_STREAM;
                   protocol:协议类别。一般填0。
        返回值:建立好的套接字。
        有了UDP的套接字之后,我们就可以利用它进行通信了,数据发送的任务由sendto函数完成.
        sendto函数:ssize_t   sendto(int sockfd,const void *buf,size_t nbytes, int flags,struct sockaddr*to,socklen_t addrlen);
         具体功能:向to结构体指针中指定的IP,发送UDP数据。
        参数:sockfd:套接字。
                   buf:发送数据缓冲区
                   bbytes:发送数据缓冲区的大小
                   flags:一般填0;
                   to:指向目的主机地质结构体的指针。
                   addrlen:to所指向内容的长度。
        把具体的参数传入sendto函数之后,数据就能发往具体的地址。这里有一点需要注意的是sendto的第五个参数,结构体指针,里面包含着目的主机的所有信息,它的类型为structsockaddr_in 型的,将来把目的主机的IP,port传进去,取地址强制类型转换成struct sockaddr *型的,就可以把数据发出去了。
        虽然有一些繁琐,但是这些都是一次网络上的通信必须要有这些过程,里面有点细节的内容我们没有提,那就是字节序的问题。下一期的文章中将重点讲解UDP的server编程以及不可或缺的字节序问题,对于本次文章内容不是太明报或者想要了解更多内容的,可以关注我们微信平台进行讨论。
        热爱Linux,热爱网络编程的少年少女们,我们下期见。

慕容复 发表于 2015-4-21 16:09:28 | 显示全部楼层
不错 支持一个了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|无忧开发者社区 (京ICP备09010168号

GMT+8, 2017-9-21 23:52 , Processed in 0.235882 second(s), 40 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 51Develop.Net

快速回复 返回顶部 返回列表