Linux初学者的一些总结

Linux 学习体会

    作为一个Linux的初学者,从最开始的双系统安装导致系统崩溃,硬盘全部被格,到熟练完成虚拟机的安装;从刚接触linux系统的茫然无知到现在的菜鸟阶段,这初始Linux的一个月真的很艰辛,不过也收获了很多,就在这里记录下来自己成长的足迹,也分享一些自己的体会,希望能给一些刚开始接触Linux的朋友一下帮助。

    安装教程网上已经有很多了,在这里就不一一陈述了,主要说一下这一个月来的学习体会:

1. 一些系统参数的设置

1.1 窗口按钮改为右手

在终端中输入如下命令:

gconftool-2 --set /apps/metacity/general/button_layout --type string “menu:minimize,maximize,close”

1.2 swap空间的重新设置

(1)在终端中输入:

free -m

会显示本机的交换空间分区大小。

(2)之后进行操作,创建一个swap文件:

sudo mkdir /swapfile     

cd /swapfile              

sudo dd if=/dev/zero of=swap bs=1024 count=2000000

//sudo是指以管理员的身份运行这个指令,这时系统会提示输入密码,照常输入,但是光标不会移动。这是与windows的区别

//madir是指创建文件目录的命令,swapfile指创建的文件名

(3)将生成的文件转换成swap文件:

sudo mkswap f swap

再次查看free –m的结果,会显示swap交换空间的改变成功。

2. gcc的使用和浅显的体会

首先必须清楚gcc是一个功能强大的编译器(不要和代码编辑器混淆了),它是用来编译写好的c程序的工具,它的编译步骤分为四步,分别为预编译、编译、汇编、连接。简单的使用方法如下:

在我们写好了c的源代码并保存了以后,l例如源程序保存为test.c,在终端中运行:

gcc test.c

此时,默认情况下系统将生成一个名为a.out的可执行文件,想要查看程序运行的结果,再输入:

./a.out

这样每编译一次新的程序时,新的a.out会覆盖成以前的,会造成一些麻烦,可以用下面的命令来修改生成的名为test(此处没有.out后缀)可执行文件名称:

gcc -o test.c test

之后,运行:

./test

在终端中即可显示程序运行结果。

注意:有时候所有的代码不一定会在一个文件中,比如我们会把头文件.h写成一个文件,主要的函数.c写成一个文件,而另外一个文件中只写程序的主体并引用函数,这是就要同运行多个.c文件,要用到下面的命令:

gcc -test test1.c test2.c test3.c ……

会生成名为test的可执行文件,执行

./test

可以查看编译结果

3. 网络编程

(1)一些准备工作:

A:IP地址结构的定义:

   #include <netinet/in.h>

/*Linux中的网络通信地址结构*/

struct socketaddr_in

{

sa_family_t  sin_family;   /*16位的地址组*/

in_port_t  sin_port;       /*16位的端口号*/

struct  in_addr sin_addr;  /*32位的ip地址*/

Usigned char sin_zero[8]; /*填充区,8个字节填“0”*/

}

   其中的第一个成员表示使用的地址族,套接字使用的场合不同,地址组也会不同,如果为网络通信的话,地址组使用AF_NET。

最后一个成员表示的是填充区,作用是保证socketaddr_in结构正好16个字节,这样做的目的是为了使socketaddr_in结构可以和socketaddr地址结构随意转换。Socketaddr结构定义如下:

#include<netinet/in.h>

Struct socketaddr

{

sa_family sa_family;

Char sa_data[14];

}

(2)要实现基本的通信首先需要了解套接字编程,即socket函数的应用,其函数原型为:

#include <sys/socket.h>

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

各参数的意义为:

A. domain表示的是通信域,对于初学者来说,只要掌握它是如下的一个宏:

AF_INET        表示使用IPv4协议

B. type表示套接字的类型,用来进一步明确通信特征。通信类型分为两类,即面向连接的通信和无连接的通信,套接字在其基础上又分为四类,当同一个域和套接字类型支持多种协议时,可以使用第三个参数protocol制定一个协议,这个参数通常为0,表示使用默认的协议。套接字类型通常由宏表示,这些宏定义在sys/socket.h文件中,如下:

套接字类型

类型描述

默认协议

SOCK_DGRAM

长度固定的无连接报文

UDP

SOCK_RAW

原始套接字

绕过协议

SOCK_SEQPACKET

长度固定的,面向连接的报文

SCTP

SOCK_STREAM

有序的,面向连接的字节流

TCP

:SOCK_RAW表示原始套接字,使用这种套接字时需要用户自己构造协议头部,也就是说用户可以绕过协议,直接访问下面的网络层。

   socket函数返回套接字的描述符,失败则返回-1,错与原因保存在errno中,在得到套接字描述符后,就可以像操作文件一样操作套接字了。

    如果不需要使用时,使用close函数即可关闭一个套接字。

注:套接字是用来做网络通信的,因此只有一个套接字什么也做不了,只有一个套接字绑定了一个地址才能够进行通信。

(3)地址绑定:Linux环境下用bind函数将一个套接字绑定到一个地址上,其函数原型如下:

#include <sys/socket.h>

int bind(int sockfd, const struc sockaddr *addr, socklen_t len);

参数含义如下:

第1个参数:是一个已经创建的套接字描述符

第2个参数:是一个地址结构,其声明的原型通常是struct sockaddr *addr,但是在实际编程中通常使用struct sockaddr_int *addr,因此,在第二个地址结构参数的时候需要做一个强制类型转换:

struct sockaddr_in *addr;

//设置地址结构

addr = (struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));

addr->sin_family = AF_INET;  //使用IPv4协议的地址组

addr->sin_port = 1024;       //端口设置为1024

//32位的IP地址,即192.169.11.6,注意应使用网络字节赋值

addr->sin_addr = 0x60ba8c0;

//地址绑定,转换addr指针的类型

bind(fd, (struct sockaddr_in)addr, sizeof(struct sockaddr_on));

   如果绑定成功,bind函数返回0;失败则返回-1。

(4)建立一个连接    /*客户端*/

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

参数说明:

A. sockfd是一个已经创建好的套接字描述符;

B. *addr是需要通信的地址,因为服务器只有一个,而客户端哟成千上万个,多以一般而言,服务器会等待客户端的连接请求而不会主动连接客户端,因此这个参数是服务器端的地址结构。

C. len是地址结构的长度,一定记得使用socklen_t来定义的,对于Ipv4协议来说,其长度为16个字符。

如果成功建立连接,函数返回0,失败则返回-1.

(5)监听和连接     /*服务端*/ 

在‘(4)’中客户端建立一个连接后,服务端就要能接受一个连接,这个过程分为2步:第1步为创建一个套接字监听连接请求;第2步创立一个新的套接字接受并处理请求。

第1步:用listen函数监听客户端的连接请求:

#include <sys/socket.h>

int listen(int sockfd, int backlog);

A: 第一个参数sockfd是用来进行连接请求监听的套接字描述符。

B: 第二个参数backlog是最多可以排队等待连接的请求数量。

如果监听成功,则函数返回0,失败返回-1;

第2步:使用accept函数接受连接请求:

#include <sys/socket.h>

int accept(int scokfd, struct sockaddr *addr, socklen_t len);

A: 第一个参数sockfd是一个创建的套接字描述符,该套接字通常就是监听套接字,当连接请求未到时,accept函数会造成服务器程序的阻塞。当接受到一个连接请求时,监听套接字就会创建一个新的套接字,该套接字拥有和监听套接字相同的地址和套接字类型,这个新套接字成为连接套接字,会完成与发出请求的客户端的连接,并从accept函数中返回,服务器程序继续运行,开始真正的通信,监听套接字继续保持监听。

B:第二个参数addr是一个地址结构,该地址往往是客户端的地址,在客户端程序调用accept函数之后,其地址回应并发送至服务器。服务器程序可以提供一个缓冲区从内核接受此地址,也可以忽略它,将该参数设置为NULL.

C:第三个参数len表示取得的客户端地址的大小,这个值要小于用户提供的缓冲区的大小。

如果成功建立了连接,accept函数返回0,失败则返回-1。

当accept函数返回时,服务器和客户端的连接就已经建立好了,依赖于该连接的通信就可以开始了。用户可以像操作文件一样操作套接字。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值