lvan_linux

lvan_linux 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

lvan_linux 发布了文章 · 3月13日

linux工具:netstat 工具使用

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 3月6日

linux工具使用介绍:iperf3网络质量测试工具介绍

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 2月19日

源代码下载地址:linux系统源代码下载。

linux源代码下载地址如下:
https://mirrors.edge.kernel.o...

查看原文

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 2月19日

源码下载地址:c语言库函数代码下载位置

所有的c语言库函数代码下载地址分享:

下面这个地址就是C苦函数下载地址。
http://ftp.gnu.org/gnu/glibc/
查看原文

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 2月8日

Linux函数学习:setsockopt、getsockopt和getsockname函数。

简介:setsockopt、getsockopt这两个函数获取套接字一些有关选项和设置套接字有关的套接字。getsockname是通过套接字获取套接字有关的一些信息,例如端口、协议等。

1:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);


sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
关于level和optname具体参数如下

level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项. 

返回说明:  
成功执行时,返回0。失败返回-1,errno被设为以下的某个值  
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字

optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 


选项名称        说明                  数据类型
========================================================================
                        SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        获得套接字错误             int
SO_KEEPALIVE      保持连接                int
SO_LINGER        延迟关闭连接              struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT       接收缓冲区下限             int
SO_SNDLOWAT       发送缓冲区下限             int
SO_RCVTIMEO       接收超时                struct timeval
SO_SNDTIMEO       发送超时                struct timeval
SO_REUSERADDR      允许重用本地地址和端口         int
SO_TYPE         获得套接字类型             int
SO_BSDCOMPAT      与BSD系统兼容              int
========================================================================
                        IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TOS         服务类型
IP_TTL         生存时间                int
========================================================================
                        IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int
TCP_NODELAY       不使用Nagle算法             int
========================================================================

int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len);
 功能:获取一个套接字的选项
 参数:
         socket:文件描述符
         level:协议层次
                        SOL_SOCKET 套接字层次
                        IPPROTO_IP ip层次
                        IPPROTO_TCP TCP层次
        option_name:选项的名称(套接字层次)
                        SO_BROADCAST 是否允许发送广播信息
                        SO_REUSEADDR 是否允许重复使用本地地址
                     SO_SNDBUF 获取发送缓冲区长度
                     SO_RCVBUF 获取接收缓冲区长度    

                     SO_RCVTIMEO 获取接收超时时间
                     SO_SNDTIMEO 获取发送超时时间
        option_value:获取到的选项的值
        option_len:value的长度
 返回值:
        成功:0
        失败:-1

int getsockname(int sockfd, struct sockaddr *localaddr,socklen_t *addrlen); 

getsockname可以获得一个与socket相关的地址。 
            服务器端可以通过它得到相关客户端地址。 
             而客户端也可以得到当前已连接成功的socket的ip和端口。 
对于TCP连接的情况,如果不进行bind指定IP和端口,那么调用connect连接成功后, 
使用getsockname可以正确获得当前正在通信的socket的IP和端口地址。 
而对于UDP的情况,无论是在调用sendto之后还是收到服务器返回的信息之后调用, 
都无法得到正确的ip地址:使用getsockname得到ip为0,端口正确。 

2:在Tinyhttpd中有类似的例子,如下代码

file

查看原文

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 2月6日

Linux函数学习:getopt、getopt_long、getopt_long_only。

简介:这几个函数是对类似于main函数那样传进来的参数进行解析。
参数的指定由-key value -key --key value --key -key value1 value2 这几种类型,其中getopt可以解决前两种类型,getopt_long能够解决所有类型的参数解析,getopt_long_only类似于getopt_long,可以处理所有选项。具体细节再后面的部分进行介绍。

首先介绍getopt选项,他是相对比较简单的。
函数原型: int getopt(int argc, char * const argv[],  const char *optstring);
argc和argv就是main函数传进来的参数,在这里就不多说了。
optstring:此参数是指定我们要解析的参数内容。eg:abc:(注,getopt函数只能处理带一个冒号的optstring)
optind:是下一次调用getopt函数应当处理参数的小标,也就是argv要处理参数的下表。
optarg:是带有一个冒号的optstring
opterr:此选项决定是否将错误消息打印到标准错误中,如果是0的话,就不打印错误了。
下面是一个例子和对应的输出。

file

file


接下来讲解getopt_long函数,前面说过,此函数能够处理所有的参数
函数原型: int getopt_long(int argc, char * const argv[],   const char *optstring,   const struct option *longopts, int *longindex);
此函数多了两个参数第一个参数结构如下。

struct option {

           const char *name;
           int         has_arg;
           int        *flag;
           int         val;
       };
name:此部分代表长选项的名称。
has_arg:此结构有几个宏为其赋值。
     no_argument(0):代表没有对应的值
     required_argument(1) :代表一定需要一个值。
    optional_argument(2):代表有没有对应的值都可以。
    flag:如果此选项不为空的话,那么将参数对应的val赋值给flag,否则返回。
  val:就是我们要返回后者付给flag对应的value。
longindex:如果此选项不为空的话,那么它将指向相对于longopts对应的下标。

下面是我给出的一个例子:和一些输出。

file

file

getopt_long_only与上述getopt_long不同之处:前者不管是“-”还是“--”都视为长选项,如果找不到的话,才去短选项哪里查找:
查看原文

赞 0 收藏 0 评论 0

lvan_linux 发布了文章 · 2月6日

Linux学习:tcpdump表达式及命令参数详解例子

1:tcpdump抓取各种类型的包。
tcp规则只有一套,但是它有两种用途。一个是用于显示抓取到的包、另一个是用于抓包。
当然有些options只能用于抓取包,有些options只能用于显示包。同时、tcpdump命令提供表达式,此项功能可以过滤掉我们抓到大包,只去显示或存储
我们想要的包。废话不多说,下面开始介绍tcp。(这其中我也有许多参数弄不明白、希望懂的人能够再评论区下方加以评论)。

首先、是总体看tcp这个命令都有哪些opitons 。

    
    tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
                             [ -c count ]
                             [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
                             [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
                             [ --number ] [ -Q in|out|inout ]
                             [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
                             [ -W filecount ]
                             [ -E spi@ipaddr algo:secret,...  ]
                             [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
                             [ --time-stamp-precision=tstamp_precision ]
                             [ --immediate-mode ] [ --version ]
                             [ expression ]
从上述可以看的出来、tcp有许多选项,我会将我不懂的地方标记出来、希望各位大神能够加以讨论。
我这里可能不是按照上述书写的顺序定义。
-i:指定我们要抓取的接口。
-D:列出我们可以使用该命令抓取包的网络接口。如下图所示

file


-c:代表抓取指数目的包就停止抓取,如下图所示。

file

从图中我们可以看到,当我们抓到5个包之后就停止抓取了。
-Q:指定过滤输入或者输出的包,如下图所示,我们只抓输入的包。如下图所示,我们使用ping命令ping本地地址,所以我们只能抓到in的包,却抓不到output的包。

file

-w:此选项是将抓到的包输入到指定的文件中,而不去限制到终端上。
-r:此选项是用于显示抓取都的包,但是具体显示细节还需要其他的参数进行控制。

如下图所示,是我们使用此命令抓取和显示的包。

file


-s:指定我们每个抓取包保存数据的大小,默认情况下是64bit。如下图所示,名下看到两次抓到的包存储到文件中文件的大小不一样。

file


-Z:此命令用于指定包的所有者和所属组,如下图所示,默认的情况下、包的所有者和所属组都是tcpdump,但是我们指定后,包的所有者和所属组就是我们指定的。

file


-F:此选项用于从指定文件中读取过滤表达式,但是使用此选项后、命令行中的表岛是将不会起作用。关于表达是这部分之后会进行讲解。
-v、-vv、-vvv:此选项用于详细显示消息,带有v的根数越多,显示的月详细。

file


如图所示,带v参数显示的更加详细。
-t、-tt、-ttt、-tttt:此选项用于包显示或者不显示时间和显示时间格式的设定<-t:不显示时间。-tt:显示时间戳。-ttt:显示和上一次抓包的时间间隔。-tttt:以年月日时分秒进行显示>:如下图所示。

file

 --immediate-mode:此选项有点类似于我们c标准IO函数的缓冲,指定这个选项便没有这个缓冲,直接将包送达。
 -B:指定缓冲的大小,也就是我们能够抓取多大缓冲的包。
 -C:指定我们存储抓取到的包文件的大小
 上述这两个选项我实在有些分不清,缓冲的大小和指定文件的大小有什么区别呢。
 
 我不知道怎么用的选项:
  --time-stamp-precision=tstamp_precision
    -E spi@ipaddr algo:secret,...
 -G rotate_seconds :此选项可以理解为轮询、他需要配合其他选项使用。如-C、当我们将文件抓满的时候,我们就会还是会继续抓、并且覆盖掉之前抓到的内容。
  -W filecount。
    

接下来我们介绍一下表达式。


表达式的作用是过滤掉我们抓到的包,我们可以再抓取的时候进行过滤,同时我们也可以再显示的时候进行过滤。

过滤包就是抓到我们想要的包:我们可以过滤指定包的协议、包的类型、包的传输源和目的和包中一些关键字进行过滤。同时我们也可以指定包中的内容进行过滤。
由于协议很多,我们抓到的包种类也有很多,因此、我们这里只用icmp作为例子进行介绍,同时man手册中的内容有许多我也不是很懂,我只是从过滤包的大体方向进行介绍。
如果想要了解更过内容、或者抓包的例子我这里没有介绍,可以参考man手册、然后搜索对应的关键字就可以。一般的情况下很容易搜索到对应的内容。

type:这里介绍过滤包的host、net、port、portrange字段,[host是主机(例如192.168.3.1),net是使用的网络(例如192.168.3.0 mask是255.255.255)]port是发送或者接受的端口、
portrange是发送或者接受的端口范围。如下图所示、说明net和host

file

dir:此字段说明传输的源于目的一些信息,这部分和type字段联合使用,可以抓指定源ip或目的ip的端口。当然、man手册还有许多用法,我这里就不一一介绍了。
proto:此字段指定我们过滤使用的协议,如udp、tcp。

最后我们介绍一下如果过滤指定类型的包,或者根据包中某些字段的值进行过滤。如下图所示、是man手册上一个简单例子。

file


我们这里给出一个抓指定icmp类型的包。

file


同时man手册中还有许多这样的定义,我们再下图中给出一些。

抓取广播

file


抓取包的长度大于或者小于某一个数。

file

查看原文

赞 0 收藏 0 评论 0

lvan_linux 提出了问题 · 2月1日

请问如何练习才能提高程序能力呢?

1:我在学习Linux的时候,如何练习才能不断提高自己呢?主要现在不知道Linux究竟如何学才能成为一个架构师。

关注 3 回答 2

lvan_linux 提出了问题 · 2月1日

请问如何练习才能提高程序能力呢?

1:我在学习Linux的时候,如何练习才能不断提高自己呢?主要现在不知道Linux究竟如何学才能成为一个架构师。

关注 3 回答 2

lvan_linux 发布了文章 · 1月31日

进程之间的关系

简介:这讲解进程之间的关系:父子进程、进程和进程组、会话。这节只需要了解即可。

1: 首先、讲解一下终端登录。


在早期的时候、我们使用终端设备进行登录,但是由于终端设备连接的有限,因此登录的用户也就是有限的。随着位映射图形终端变得可用,开发出了窗口系统,它向用户提供了与主机
系统进行交互的新方式。在这里、我简单介绍一下过去有终端设备登录的流程(只是做为一个了解)。

首先是init进程读取/etc/ttys文件(此文件保存各个终端设备的信息),为每一个终端创建一个空的环境。然后使用getty函数以读写的方式打开终端,并将标准输入、输出和错误
重置到该终端中,最后执行login程序进行登录。

2:这里简单介绍一下进程组的概念。


每一个进程都属于一个进程组,每个进程组有类似与进程ID的进程组ID。进程组的存在方便我们管理控制。在上一节中、我们介绍回收进程的时候,可以等待指定进程组ID中的进程结束。
有些时候,我们可能需要很多个进程合作去完成某一项任务。这时候,我们可以使用进程组的概念去会后进程组中的进程。下面我简单列举一个例子。

多进程服务器:每当一个客户端到来的时候、我们创建一个新的进程去执行相应的任务。当执行完任务后,子进程就会向父进程发送终止信号,这时候、我峨嵋你不清楚是该进程组中的那个进程结束了。因此、我们可以选择去回收该进程组中的进程。

我们可以使用如下函数获取和设置进程ID。
int setpgid(pid_t pid, pid_t pgid);
此函数用于将指定进程ID设置为pgid,但是这个函数只能为自己或者对应的子进程设置进程组ID,同时、如果子进程使用了exec函数后就不能设置进程组ID。
如果你想要父子进程同属一个进程组,那么请在fork之后使用此函数设置进程组ID。
int getpgid(pid_t pid);
获取指定进程ID的进程组ID。
注:只要进程组中有一个进程存在,那么该进程组就存在。(因此、在这里我们觉得进程组ID是这进程创建终止而随时变化的。

3:会话


会话的概念倒是十分简单、他就是几个进程组的集合。
会话是没有会话ID的,通常我们可以获得该进程的首个进程组的进程组ID。
通常情况下、我们可以fork一个子进程去调用如下的函数以保证改进程和其他进程没有什么关系(除了、父进程是init进程)。
pid_t setsid(void);
将调用该函数的进程设置为一个会话。在调用此函数后、改进程会发生如下情况。
a)改进程成为一个会话的首进程。
b)该进程是一个新的进程组的组长进程。
c)如果改进程之前和控制终端有联系的话,那么现在改进程和控制终端将不会有什么联系。
pid_t getsid(pid_t pid);
此函数用于获取指定进程所处会话首个进程组的进程组ID。

4:控制终端。


会话和进程组有一些其他的恶行:
a:一个会话可以有一个控制终端。这通常是登录到其他的终端设备或伪终端设备。
b:建立与控制终端连接的进程称为伪终端进程。
c:一个会话中可以分为前台进程组和后台进程组。
d:如果一个会话有一个控制终端,则它有一个前台进程组,会话中的其他进程组则为后台进程组。
e:信号会发送给前台进程组。

如下两个函数用于通知内核哪一个是前台进程组。
pid_t tcgetpgrp(int filedes);//用于将filedes先关联的终端设备前台进程组的进程组ID。


查看原文

赞 1 收藏 1 评论 0

认证与成就

  • 获得 1 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 1月13日
个人主页被 831 人浏览