Linux下C语言开发-网络编程

文章目录

在前面的章节里,我们介绍了Linux下C语言开发的一些基础知识,本篇文章会介绍下非常常见的一个应用-网络编程

不管在Windows平台下面还是在Linux平台下面,网络编程都是少不了的。在互联网发达的今天,我们的生活基本上已经离不开网络了。我们可以用网络干很多的事情,比如说IM聊天、FTP下载、电子银行、网络购物、在线游戏、电子邮件的收发等等。所以说,对于一个软件的开发者来说,如果说他不会进行网络程序的开发,那真是难以想象的。

OSI七层模型介绍

在开始介绍网络编程的方法之前,我们可以回忆一下计算机网络的相关知识。目前为止,我们使用的最多网络协议还是tcp/ip网络。通常来说,我们习惯上称为tcp/ip协议栈。下面是tcp/ip协议栈的分层结构:

c54633cd7c98c9268199575e1b23d5af

网络的不同层次实现网络的不同功能:

物理层主要实现报文的成帧处理;数据链路层完成对报文的优先级的管理,同时实现二层转发和流量控制;

网络层实现路由和转发的功能,一方面它需要实现对报文的fragment处理,另外一方面它还需要对路由信息进行处理和保存;

传输层实现报文的发送和接受,它利用计数、时序、定时器、重发等机制实现对报文的准确发送,当然这都是tcp的发送机制,而udp一般是不保证报文正确发送和接收的;

应用层就是根据传输层的端口信息调用不同的程序来处理传输的内容,端口8080是http报文,端口21是ftp报文等等。

大家可以简单的理解为:

物理层关心的是如何把电气信号变成一段报文;

数据链路层关心的是mac地址、vlan、优先级等;

网络层关心的是ip地址,下一跳ip;传输层关心的是端口资源;

应用层关心的是报文组装、解析、渲染、存储、执行等等。

目前关于tcp/ip完整协议栈的代码很多,其中我认为写得比较好的还是linux内核/net/ipv4下面的代码。如果朋友们对ipv6的代码感兴趣,也可以看看/net/ipv6的代码。如果朋友们希望对整个协议栈的代码结构有更深一步的理解,可以参考《linux网络分析与开发》这本书。

应用程序开发

当然,作为应用层,我们的其实考虑的不用这么复杂。对于网络程序编写人员来讲,所有网络的资源只要和一个socket关联在一起就可以了。当然在socket可用之前,我们需要为它配置端口信息和ip地址。配置完了之后,我们就可以慢慢等待报文的收发了。所以一般来说,作为服务器端口的处理流程是这样的,

    a) 创建socket
    b) 绑定socket到特定的ip地址
    c) 对socket进行侦听处理
    d) 接受socket,表明有客户端和服务器连接
    e) 和客户端循环收发报文
    f) 关闭socket

作为服务器程序而言,它要对特定的端口进行绑定和侦听处理,这样稍显复杂。但是如果是编写客户端的程序,一切的一切就变得非常简单了,

    a) 创建socket
    b) 连接服务器端地址
    c) 和服务器端的socket收发报文

小结

上面只是对网络编程做了一个基本的介绍,但是好多的东西还是没有涉及到,比如说:
(1) 什么时候该使用udp,什么时候该使用tcp?
(2) 如何把多线程和网络编程联系在一起?
(3) 如何把多进程和网络编程联系在一起?
(4) 如何利用select函数、epoll_create机制、非阻塞函数提高socket的并发处理效率?
(5) linux内核是怎么实现tcp/ip协议的?
(6) 我们自己是否也可以实现协议的处理流程等等?

tennfy也将会在后面进行进一步的介绍。

参考文章: linux下的C语言开发(网络编程)

本文出自 TENNFY WU,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/4835.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

1 + 5 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部