【编程基础】初学者如何学习Linux网络

1. Linux网络编程--网络知识介绍

网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端.

1.1 客户端

在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一

个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序。

1.2 服务端

和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。

比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。

互为客户和服务端

实际生活中有些程序是互为服务和客户端。在这种情况项目, 一个程序既为客户端也是服务端。

1.3 常用的命令

由于网络程序是有两个部分组成,所以在调试的时候比较麻烦,为此我们有必要知道一些常用的网络命令

1.3.1 netstat

命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项.

我们常用的选项是-na 用来显示详细的网络状态.至于其它的选项我们可以使用帮助手册获得详细的情况.

1.3.2 telnet

telnet是一个用来登录远程的程序,但是我们完全可以用这个程序来调试我们的服务端程序的.

比如我们的服务器程序在监听8888端口,我们可以用

telnet localhost 8888

来查看服务端的状况.

1.3.3 ping 程序用来判断网络的状态是否正常,最经常的一个用法是

ping 192.168.0.1

表示我们想查看到192.168.0.1的硬件连接是否正常

1.4 TCP/UDP介绍

1.4.1 TCP(Transfer Control Protocol)传输控制协议

是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端的连接是可靠的,安全的。

1.4.2 UDP(User Datagram Protocol)用户数据报协议

是一种非面向连接的协议,这种协议并不能保证我们的网络程序的连接是可靠的,所以我们现在编写的程序一般是采用TCP协议的.

2. Linux网络编程--初等网络函数介绍(TCP)

Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个 通讯的文件描述符, 我们可以将这个描述符看成普通的文件的描述符来操作, 这就是linux的设备无关性的好处。我们可以通过向描述符读写操作实现网络之间的数据交流。

2.1 socket

int socket(int domain, int type,int protocol):

用于主机之间通信建立。

2.2 bind

int bind(int sockfd, struct sockaddr *my_addr, int addrlen):

将本地的端口同socket返回的文件描述符捆绑在一起

2.3 listen

int listen(int sockfd,int backlog)

listen函数将bind的文件描述符变为监听套接字

2.4 accept

int accept(int sockfd, struct sockaddr *addr,int *addrlen)

accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接。

2.5 connect

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)

connect函数是客户端用来同服务端连接的

3. 总结

总的来说网络程序是由两个部分组成的--客户端和服务器端.它们的建立步骤一般是:

服务器端:

socket-->bind-->listen-->accept

客户端:

socket-->connect

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04上设置Node.js生产应用程序

Node.js是一个开源JavaScript运行时环境,用于轻松构建服务器端和网络应用程序。该平台可在Linux,OS X,FreeBSD和Windows上运行...

330
来自专栏技术博文

redis配置文件相关

1. 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonize no 2. 当Redis在后台运行时,Redis...

2878
来自专栏云计算教程系列

如何在Ubuntu 16.04上设置Nginx服务器块(虚拟主机)

使用Nginx Web服务器时,可以使用服务器块(类似于Apache中的虚拟主机)来封装配置详细信息,并从单个服务器托管多个域。

3.1K0
来自专栏Jerry的SAP技术分享

使用JDK自带的jmap和jhat监控处于运行状态的Java进程

对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等。

1412
来自专栏Python绿色通道

Python线程与进程的一些概念

概念 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数...

1023
来自专栏用户2442861的专栏

利用SecureCRT上传、下载文件(使用sz与rz命令),超实用!

    借助securtCRT,使用Linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器。

1591
来自专栏简单聊聊Spark

大数据在实际生产环境的前期准备

eg:  bigdata-cdh01.test.com. bigdata-cdh02.test.com. bigdata-cdh03.test.com

953
来自专栏小狼的世界

CentOS中设置系统级代理

proxy=http://username:password@proxy_ip:port/

1102
来自专栏自动化测试实战

Git教程——撤销内容修改和版本回退

60810
来自专栏刺客博客

Linux下使用mkfs快速对磁盘进行分区

1234

扫码关注云+社区