當前位置:首頁 » 操作系統 » linux建立服務

linux建立服務

發布時間: 2023-06-13 18:25:23

linux 環境下搭建NFS服務

NFS(Network File System),網路文件存儲系統,它最早是由 Sun 公司開發的,也是 FreeBSD 支持的文件系統中的一個,它允許網路中的計算機之間通過TCP/IP 網路共享資源。通過 NFS 協議,我們本地 NFS 的客戶端應用可以透明的讀寫位於服務端 NFS 伺服器上的文件,就像訪問本地文件一樣方便。簡單的理解,NFS 就是可以透過網路,讓不同的主機,不同的操作系統可以共享存儲的服務。
NFS 在文件傳送或信息傳送過程中依賴 RPC(Remote Procere Call)協議,即遠程過程調用,NFS的各項功能都必須向 RPC 來注冊,如此一來 RPC 才能了解 NFS 這服務的各項功能 Port,PID,NFS 在伺服器所監聽的 IP 等,而客戶端才能透過 RPC 的詢問找到正確對應的埠,所以 NFS 必須要有 RPC 存在是才能成功的提供服務,簡單的理解二者關系:NFS 是一個文件存儲系統,而 RPC 是負責信息的傳輸。

通過上面的簡介,我們知道 NFS 服務需要依賴 RPC 服務,所以這里 NFS 服務端需要安裝 rpcbind 和 nfs-utils ,客戶端只需要安裝 nfs-utils 即可,由於我們選用 CentOS 系統,所以可以使用 yum 快速的安裝。

然後安裝 NFS 服務

另:Ubuntu 16.04 安裝命令

我們在服務端創建一個共享目錄 /data/share ,作為客戶端掛載在遠端入口,然後設置許可權

然後,修改 NFS 配置文件 /etx/exports

說明一下,這里配置後邊有很多參數,每個參數有不同的含義,具體可以參考下邊。此處,我配置了將 /data/share 文件目錄設置為允許IP為 192.168.0.0/24 區間的客戶端掛載。然後,如果客戶端IP不在該區間也想要掛載的話,可以設置IP區間更大或者設置為 * 即允許所有客戶端掛載,例如: /home *(ro, sync,insecure,no_root_squash) 設置 /home 目錄允許所有客戶端只讀掛載。

接下來,我們先啟動 RPC 服務

我們發現,啟動了 NFS 服務後,RPC 注冊的埠列表明顯增多。現在服務端都啟動起來了,在服務端看下是否正確載入了設置的 /etc/exports 配置

最後,在另一台Linux虛擬機上測試一下,是否能夠正確掛載。首先,我們可以在客戶端查看下NFS服務端設置可共享的目錄信息

然後,在客戶端創建掛載目錄/share

最後,掛載遠端目錄到本地 /share 目錄

可以看到,可以正確將遠端 NFS 目錄掛載到本地。注意:掛載點 /share 目錄必須已經存在,而且目錄中沒有文件或子目錄
最後,我們在 NFS 服務端 /data/share 目錄下創建一個文件,看下客戶端能否正確讀取並修改

都可以了,這里因為上面設置了 NFS 遠端目錄許可權為 rw 擁有讀寫許可權,如果設置為 ro ,那麼客戶端只能讀取,不能寫入。根據實際應用場景合理配置。
NFS 默認使用 UDP協議進行掛載,為了提供 NFS 的穩定性,可以使用 TCP 協議掛載,那麼客戶端掛載命令如下:

最後,卸載命令

② 怎麼用搭建linux伺服器

方便一點,找來一個比較全一點的linux光碟,最好是免費的,以免版權問題

然後全部安裝。

接下去就是根據自己的需求,關閉和打開相應的服務即可,全部安裝後有Xwindows可操作,對於windows習慣的用戶來說比較方便。

另外一種就是找一個簡易化的linux,最小化安裝,別忘了最好能夠選擇加入gcc編譯器,然後去網上下載相應的服務軟體,安裝,運行即可。這種方法系統比較干凈,而且可以安裝到全部最新的軟體,當然比較適合於對linux比較熟悉的人

③ Linux怎麼搭建Web伺服器

Linux怎麼搭建Web伺服器
1,基於apache的web伺服器基礎搭建:
(1)實驗環境:一台ip為192.168.10.10的rhel5.9主機作為web伺服器,一台ip為192.168.10.15的win7主機作為測試機
(2)查看服務主機軟體是否安裝
[root@ser1 ~]# rpm -q httpd httpd-manual httpd-devel
package httpd is not installed
package httpd-manual is not installed
package httpd-devel is not installed
(3)安裝軟體包
[root@ser1 ~]# yum install -y httpd httpd-manual httpd-devel
(4)啟動服務
[root@ser1 ~]# service httpd start
啟動httpd: [確定]
[root@ser1 ~]# chkconfig httpd on
(5)在win7上測試,無網頁預設下顯示紅帽測試頁
<報錯頁面存放位置/var/www/error/noindex.html>
.jpg
(6)打開配置文件
[root@ser1 ~]# vim /etc/httpd/conf/httpd.conf
可獲得以下重要欄位:
目錄設置:
<Directory 目錄> .. .. </Directory>
訪問位置設置:
<LocationURL> .. .. </Location>
虛擬主機設置:
<VirtualHost 監聽地址> .. .. </VirtualHost>
常用的全局設置參數:
ServerName本站點的FQDN名稱
DocumentRoot網頁文檔的根目錄:預設/var/www/html/
DirectoryIndex默認索引頁/首頁文件:一般設為index.html index.php
ErrorLog錯誤日誌文件的位置
CustomLog 訪問日誌文件的位置
Listen 監聽服務的IP地址、埠號
ServerRoot 服務目錄:/etc/httpd/
Timeout網路連接超時,默認 300 秒
KeepAlive是否保持連接,可選On或Off
MaxKeepAliveRequests每次連接最多處理的請求數
KeepAliveTimeout保持連接的超時時限
Include 可包含其他子配置文件: /etc/httpd/conf.d/
(7)創建測試網頁
[root@ser1 ~]# vim /var/www/html/index.html
<h1>
This is a test page !!!
</h1>
~
(8)win7下測試,主頁變為測試網頁
.jpg
2,基於apache的web伺服器的訪問控制:
(1)web服務的地址限制
I,rder 配置項,定義控制順序
allow,deny 先允許後拒絕,預設拒絕所有;沖突時,拒絕生效;allow不設置,拒絕所有
deny,allow 先拒絕後允許,預設允許所有;沖突時,允許生效;deny不設置,允許所有
II,Allow/Deny from 配置項,設置許可權
Allow from 地址1 地址2 .. ..
Deny from 地址1 地址2 .. ..
配置如下:
[root@ser1 ~]# vim /etc/httpd/conf/httpd.conf
331 #
332 Orderallow,deny
333 Allowfrom 192.168.20.0/24
334
335 </Directory>
[root@ser1 ~]# service httpd restart……重啟服務
停止httpd: [確定]
啟動httpd: [確定]
在win7上測試,測試完成並還原配置文件:
.jpg
看過「 Linux怎麼搭建Web伺服器 」的人還看了:
1.win7如何搭建Web伺服器
2.基於WebRTC的瀏覽器端Web伺服器的研究論文
3.LINUX下配置管理APACHE伺服器的方法
4.如何安全設置Apache Web伺服器
5.全國網路技術水平考試二級實踐指導書

④ 在linux系統中,哪些常用的服務需要構建

3.1Telnet

協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標准協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到伺服器。終端使用者可以在telnet程序中輸入命令,這些命令會在伺服器上運行,就像直接在伺服器的控制台上輸入一樣。可以在本地就能控制伺服器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄伺服器。Telnet是常用的遠程式控制制Web伺服器的方法。

在Linux的命令行窗口輸入「telnet 192.168.1.230」,如圖出現登錄界面,根據提示輸入用戶名和密碼即可。

3.2ftp

伺服器(File Transfer Protocol Server)是在互聯網上提供文件存儲和訪問服務的計算機,它們依照FTP協議提供服務。 FTP是File Transfer Protocol(文件傳輸協議)。顧名思義,就是專門用來傳輸文件的協議。簡單地說,支持FTP協議的伺服器就是FTP伺服器。

無論在Linux系統還是windows系統中,一般安裝後都自帶一個命令行的ftp命令程序,使用ftp可以登錄遠程的主機,並傳遞文件,這需要主機提供ftp服務和相應的許可權;我們可以從PC機的命令行窗口登錄開發板,並向開發板傳遞文件。

在Linux的命令行窗口輸入命令ftp 192.168.1.230即對方的IP地址,即可連接上指定地址的伺服器,根據提示輸入用戶名和密碼即可登錄。

3.3ssh

為Secure Shell的縮寫,由 IETF 的網路小組(Network Working Group)所制定;SSH 為建立在應用層基礎上的安全協議。SSH 是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其他操作平台。SSH在正確使用時可彌補網路中的漏洞。SSH客戶端適用於多種平台。幾乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、DigitalUNIX、Irix,以及其他平台,都可運行SSH。

可以在PC上通過網路進入開發板上的字元終端進行操作,方法如下:

1)在開發板上連接乙太網線開機(或者連接USB Wifi),然後在串口終端上用ifconfig 命令查看一下開發板的IP地址,如果沒有連接串口終端,也可以在LCD上進入網路設置應用,設置一個IP地址,例如192.168.1.230

2)現在回到PC ,在PC Linux命令行下,假設開發板的IP地址是192.168.1.230,則輸入命令[email protected],然後輸入密碼fa即可進入開發板的字元終端

3.4 NFS伺服器

掌握NFS伺服器的安裝、配置和使用掌握NFS客戶端的配置掌握掛載和卸載共享目錄了解Windows文件共享的基本概念和Samba伺服器的功能掌握Samba伺服器的配置管理掌握Samba客戶程序的使用了解TFTP掌握TFTP伺服器的配置管理掌握TFTP客戶端程序的使用

3.5 TFTP伺服器

Ubuntu中TFTP伺服器配置:apt-get install tftp-hpa tptpd-hpa下載TFTP伺服器,sudo vim /etc/default/tftpd-hpa

內容如下:

TFTP_USERNAME=「tftp」

TFTP_DIRECTORY=」/home/linux/tftpboot」

TFTP_ADDRESS=」0.0.0.0:69」

TFTP_OPTIOS=」--secure」

sudo service tftpd-hpa stop

sudo service tftpd-hpa start

sudo service tftpd-hpa status

sudo service tftpd-hpa restart

然後可以在別的主機使用命令tftp <伺服器ip>

使用命令:get <filename> 上傳本地文件到TFTP伺服器,put<filename>下載TFTP伺服器的文件到本地

NFS是SUN開發的,用於Unix機器之間的資源共享。目前被廣泛應用於Linux系統之間的資源共享。

Samba伺服器

主要用於在Windows和Unix之間共享資源。資源包括文件、列印機等等。目前被廣泛應用於Windows與Linux之間實現資料共享。

  • 配置文件smb.conf。/etc/samba/smb.conf

  • 輸入"sudo service smbd restart"重啟samba服務-->回車-->服務重啟成功訪問共享名為myshare的共享目錄

  • 在"運行"窗口中輸入"\192.168.1.4"-->回車-->雙擊打開myshare-->回車-->輸入用戶名和密碼-->回車-->訪問成功。

⑤ 用linux怎樣建立伺服器

裝上 web 伺服器,一般建議 apache ,以及 php 支持,如果還需要資料庫的功能,資料庫伺服器裡面的 mysql 部分。

之後就差不多了。默認網站的地址要看實際選擇的系統了,安裝方法也要看你的選擇的系統。

大部分 Linux 都可以直接安裝這些程序,不管是安裝盤還是在線軟體源里。一般都有。不需要自己從源代碼編譯的。
而且網上這種文章很多的。

⑥ 怎樣在Linux下建立PPPOE伺服器

Linux自身的網路設置

Linux做PPPOE伺服器,在操作上雖然也可以在圖形界面中是為網卡設置IP地址,但是真正實現網卡IP地址等信息的准確可靠,還是要在相應的文件中作設置,我們本次要設置兩塊網卡,編輯好的文件內容如下:

[root@localhost network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@localhost network-scripts]# more ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="0.0.0.0"
DEVICE="lan"
HWADDR="00:0C:29:33:69:86"
ONBOOT="yes"
NETMASK="0.0.0.0"
[root@localhost network-scripts]# more ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.70.10.11"
DEVICE="wan"
HWADDR="00:0C:29:33:69:90"
ONBOOT="yes"
NETMASK="255.255.0.0"
GATEWAY="10.70.0.1"
Linux做PPPOE伺服器的設置過程中,我們重點看一下ifcfg-eth1的配置文件,其中ONBOOT="yes"是必須的,可以保證系統啟動網卡自動連接到網路上,網關的信息是我們手工添加進出去,保證有網關可以正常的訪問外部網路,ifcfg-eth0文件中只要保證ONBOOT="yes"就可以了,當然象在routeros中一樣,我們將外網口的名字定義為wan,將內網口的名字定義為lan。

Linux做PPPOE伺服器設置

一)檢查本機有沒有安裝PPPOE服務

[root@localhost network-scripts]# rpm -q rp-pppoe
rp-pppoe-3.5-35
以上信息說明安裝了

二)配置必要的參數

為了使Linux中的配置過程比較好理解,我們以routeros下的配置過程作為參考。

1、了解pppoe-server-options

這個文件有點類似於ROUTERS下的profile文件,在這個文件中定義了使用哪種驗證方式:require-chap,為用戶分配的DNS伺服器地址是多少:

ms-dns 219.146.0.130
ms-dns 222.175.169.91
完整的pppoe-server-options文件如下所示

[root@localhost ppp]# more pppoe-server-options
# PPP options for the PPPoE server
# LIC: GPL
require-chap
login
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns 219.146.0.130
ms-dns 222.175.169.91
2、添加用戶名和密碼

在相同的目錄下有一個chap-secrets文件,在這裡面可以添加用戶名和密碼

[root@localhost ppp]# more chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
abc * abc *
3、允許本地驗證

也就是修改options文件,將而來默認的lock改為local即可。

[root@localhost ppp]# more options
#lock
local
4、開啟PPPOE服務

[root@localhost ppp]# more pppstart
pppoe-server -I lan -L 192.168.0.1 -R 192.168.0.5 -N 10
像以前一樣,我將這條命令做成了一個腳本,這樣操作測試其中的參數比較方便,我簡單介紹一下Linux做PPPOE伺服器當中這條命令中的各個參數的意思。

I:指定響應PPPOE請求的埠,本例中是在lan口上。

L:PPPOE伺服器的IP地址,這是客戶端所填的PPPOE伺服器的地址。

R:這是分配給客戶端的地址池起始地址,本例中從192.168.0.5開始

N:地址池的IP地址遞增幾個,本例中添增10,也就是從192.168.0.5開始,到192.168.0.14結束。

做完以上的設置,我們再梳理一下routeros下建立PPPOE服務的步驟

1、添加一個地址池

2、添加一個profile文件

3、添加撥號用戶

4、啟動pppoe服務

對照一下,可以看出我們在Linux中將以上步驟都完成了,也就是說PPPOE服務准備好了,客戶端PPPOE撥號,順利的話就可以撥號成功了。當然現在客戶端還不能上網,設置Linux做PPPOE伺服器的這個時候,還沒有啟用NAT,我們用IPTABLES軟體來實現,寫一個這樣的腳本即可:

echo "1" >> /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o wan -j SNAT --to 10.70.10.23
第一行的作用是啟用IP轉發,第二行是啟動IPTABLES進行NAT轉換,下面是對各個參數的解釋

-t nat表示進行NAT轉化

-s 192.168.0.0/24表示源地址為192.168.0.0/24這個網段

-j SNAT --to 10.70.10.23表示將源地址都轉化成10.70.10.23這個外網地址

同樣的,我們可以對照routeros系統里NAT的設置來理解這條命令。啟動NAT以後,這台PPPOE伺服器就功能完整了,客戶端不僅可以撥通伺服器,撥通後還可以上網。

⑦ 如何在linux系統搭建http服務

1、安裝ftp服務端,方便你從客戶端上傳文件。linux上一般安裝vsftp.VSFTP的軟體安裝包是: vsftpd-2.2.2-12.el6_5.1.i686.rpm
查詢:#rpm -q vsftpd
安裝:#rpm -ivh vsftpd-2.2.2-12.el6_5.1.i686.rpm或者直接yum install vsftpd
啟動、停止及重啟VSFTP的命令: #service vsftpd start/stop/restart
配置文件:
/etc/vsftpd/vsftpd.conf //主配置文件
/etc/vsftpd.ftpusers //被禁止登錄FTP的用戶文件
/etc/vsftpd.user_list //允許登錄FTP的用戶文件
a、將登錄後的用戶限制在本地家目錄下:
#vi /etc/vsftpd/vsftpd.conf
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
新建受限用戶的列表文件並加入受限用戶名
#vi /etc/vsftpd.chroot_list
raykeso
重啟ftp服務
#service vsftpd restart
2、安裝apache,開啟目錄索引,這樣你就可以瀏覽和下載文件。
apache配置文件
<Directory "I:/build/dist"> #設置瀏覽文件的目錄
Options Indexes #開啟目錄列表索引模式Order allow,deny
Allow from all
</Directory>

⑧ 如何實現在Linux下創建服務程序

Linux系統能提供強大可靠的網路服務,並有管理程序對服務進行管理。例如我們熟悉的Web、FTP和電子郵件等,它們既可以單獨運行,也可以被守護進程inetd調用,而且運行得都非常好。但我們不能僅停留在贊嘆中,下面就給出兩個服務程序程序和一個客戶程序的例子,介紹服務程序和客戶程序之間是如何溝通的。另外還要編輯配置一些文件,讓服務程序也能接受服務管理程序管理。

這兩個服務程序功能相同,但一個是獨立服務程序,另一個是被inetd調用的服務程序。這是TCP/IP網路服務的兩大類,這里將兩個程序放在一起是為了比較程序結構和運行方式。兩服務程序都在Red Hat Linux 7.1和TurboLinux 7.0上調試通過。

獨立伺服器

TCP和UDP是兩大TCP/IP數據傳輸方式,套介面是建立伺服器客戶機連接的機制,首先介紹它們建立通信聯系的過程,然後給出一個TCP服務程序例子。

1.TCP套介面通信方式

對於TCP伺服器端,服務程序首先調用建立套介面的函數socket(),然後調用綁定服務IP地址和協議埠號函數bind()。綁定成功後調用被動監聽函數listen()等待客戶連接,還要調用獲取連接請求函數accept(),並一直阻塞到客戶連接請求的到達,這個函數獲取客戶機IP地址和協議埠號。

對於TCP客戶端,客戶程序啟動後後調用建立套介面函數socket(),然後調用連接函數connect(),此函數與伺服器通過三次握手建立連接。

伺服器和客戶機建立連接後,就可以使用讀函數read()和寫函數write()收發數據了。數據交換完成後便各自調用關閉套介面函數close()刪除套介面。TCP套介面通信方式見圖1所示。

圖1 TCP套介面通信方式

2.UDP套介面通信方式

UDP程序與TCP的區別是無需建立連接。伺服器首先啟動,然後等待用戶請求。客戶機啟動後便直接向伺服器請求服務,伺服器接到請求後給出應答。

對於UDP伺服器端,服務程序首先調用套介面函數socket(),然後調用綁定IP地址和協議埠號函數bind()。之後調用函數recvfrom()接收客戶數據,調用sendto()向客戶發送數據。

對於UDP客戶端,客戶機程序啟動後調用套介面函數socket(),然後調用sendto()向伺服器發送數據,調用recvfrom()接收伺服器數據。

雙方數據交換成功後,各自調用關閉套介面函數close()關閉套介面。UDP套介面通信方式見圖2所示。

圖2 UDP套介面通信方式

下面給出獨立服務程序的例子。這個程序雖然簡單,但是與復雜程序有著相同的結構。

//程序名:server.c
//功能:伺服器從客戶機讀入一個字元,並將排在此字元後面的字元回送客戶機
//伺服器埠:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用於存放fork()執行結果
int server_sockfd,client_sockfd; //用於伺服器和客戶機套介面描述符
int bind_flag,listen_flag; //用於存放bind()和listen()執行結果
int server_address_length,client_address_length; //作為伺服器客戶機地址長變數
struct sockaddr_in server_address; //作為伺服器地址結構變數(含地址和埠)
struct sockaddr_in client_address; //作為客戶機地址結構變數(含地址和埠)
if((pid=fork())!=0) //用fork()產生新進程
exit(0) ;
setsid() ; //以子進程開始下面的程序

函數socket(),創建一個套介面,成功則返回套介面描述符。

server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(「socket error /n」);
exit(1);
}
server_address.sin_family=AF_INET;

函數htonl()用於將32位主機位元組順序轉換為網路位元組順序,其中參數INADDR_ANY表示任何IP地址。

server_address.sin_addr.s_addr=htonl(INADDR_ANY);

函數htons()用於將16位主機位元組順序轉換為網路位元組順序,其中的參數是綁定的埠號,讀者可根據環境自行改動,目的是不與其它服務埠沖突。

server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);

函數bind()用於綁定本地地址和服務埠號,若調用成功返回值為0。

bind_flag=bind(server_sockfd,/
(struct sockaddr *)&server_address,/
server_address_length);
if(bind_flag<0)
{
printf(「bind error /n」);
exit(1);
}

函數listen(),指明伺服器的隊列長度,被動等待客戶連接,調用成功返回值為0。

listen_flag=listen(server_sockfd,5);
if(listen_flag<0)
{
printf(「listen error /n」);
exit(1);
}

while(1)
{
char ch;

函數accept()等待和獲取用戶請求,為每個新連接請求創建一個新的套介面,調用成功返回新套介面描述符。

client_sockfd=accept(server_sockfd,/
(struct sockaddr *)&client_address,/
&client_address_length);

函數read()和write()用於在伺服器和客戶機之間傳送數據,調用成功返回讀和寫的位元組數。

函數close(),用於程序使用完一個套介面後關閉套介面,調用成功返回值0。其中的參數為accept()創建的套介面的描述符client_sockfd。

read(client_sockfd,&ch,1);
printf(「cli_ch=%c」,ch);
ch++;
write(client_sockfd,&ch,1);

close(client_sockfd);
}
}

程序完成後就可以使用命令進行編譯。在命令行中輸入「gcc -o server server.c」,將server.c編譯成可執行程序server,這時便可用客戶程序進行測試。在命令行執行「./server」啟動服務程序,執行「netstat -na」查看有無server的服務埠。如果存在,則執行下面編寫的客戶程序「./client」。不過這僅是手工啟動的方法,下面給出用服務管理程序管理server程序的方法。只要在目錄/etc/rc.d/init.d下放入服務程序的腳本就能被服務程序讀到。在命令行執行「touch server」創建文件server,並將文件屬性改成可執行。在管理程序中並不能看到此服務名,腳本文件必須有一些結構才能被管理程序認為是服務程序腳本。

為了減少工作量,拷貝/etc/rc.d/init.d下腳本httpd,將拷貝腳本名命名為server,然後對其編輯。

(1)執行「cp httpd server」。

(2)用文本編輯器vi(其它編輯器亦可)將server打開進入編輯狀態。首先用字元串server替換httpd。然後找到daemon server行,如果編寫的程序放在變數PATH目錄中,不需要修改此行;如果把服務程序放在其它目錄中,就要寫服務的全路徑。例如程序在/root的目錄中,就要寫成daemon /root/server,還要刪除「rm -f /var/run/server.pid」這一行。

(3)執行「chmod 755 server」,將server屬性設定為可執行。

此時就可以用chkconfig、ntsysv等工具,在希望的運行級中增加這個新服務程序,然後測試客戶機與伺服器能否通信。

被xinetd調用的服務程序

在Linux系統中,有很多服務是被xinetd(較早版本使用的是inetd)超級守護伺服器啟動的。其實凡是基於TCP和UDP的服務都可使用超級守護進程啟動,只是在服務量很大影響效率的情況下不被採用。

1.依賴xinetd啟動的服務建立通信過程

為了與獨立伺服器程序比較,我們看一下依賴xinetd的伺服器是如何啟動的。

(1)xinetd啟動時讀取/etc/xinetd目錄中的文件(早期版本為/etc/inetd文件),根據其中的內容給所有允許啟動的服務創建一個指定類型的套介面,並將套介面放入select()中的描述符集合中。

(2)對每個套介面綁定bind(),所用的埠號和其它參數來自/etc/xinetd目錄下每個服務的配置文件。

(3)如果是TCP套介面就調用函數listen(),等待用戶連接。如果是UDP套介面,就不需調用此函數。

(4)所有套介面建立後,調用函數select()檢查哪些套介面是活動的。

(5)若select()返回TCP套介面,就調用accept()接收這個連接。如果為UDP,就不需調用此函數。

(6)xinetd調用fork()創建子進程,由子進程處理連接請求。

◆ 子進程關閉所有其它描述符,只剩下套介面描述符。這個套介面描述符對於TCP是accept()返回的套介面,對於UDP為最初建立的套介面。然後子進程連續三次p()函數,將套介面描述符復制到0、1和2,它們分別對應標准輸入、標准輸出和標准錯誤輸出,並關閉套介面描述符。

◆ 子進程查看/etc/xinetd下文件中的用戶,如果不是root用戶,就用調用命令setuid和setgid將用戶ID和組ID改成文件中指定的用戶。

(7)對於TCP套介面,與用戶交流結束後父進程需要關閉已連接套介面。父進程重新處於select()狀態,等待下一個可讀的套介面。

最後調用配置文件中指定的外部服務程序,外部程序啟動後就可與用戶進行信息傳遞了。

2.為xinetd編寫專門的服務程序

除了獨立服務程序能被xinetd啟動外,還可以為xinetd編寫專門的程序。此處的例子程序與上面server.c功能相同。不過兩者的程序區別是很大的,此例的代碼僅相當於上面傳輸數據的部分。我們還將程序名定為server.c,所以不能放在相同目錄中,同名僅是為了和上面程序對照。

#include "unistd.h"
int main()
{
char ch;
read(0,&ch,1);
ch++;
write(1,&ch,1);
}

將程序編譯成可執行文件,並做些設置就可被xinetd啟動。注意不要和上面的獨立服務程序server一起啟動,因為客戶程序寫得比較簡單,訪問的是固定埠,伺服器都設成了相同的埠號。

(1)編輯/etc/services文件,在行末增加一條記錄:

server 9000/tcp

(2)在目錄/etc/xinetd.d下編寫文件server,內容為:

service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此處設置成自己程序所在的目錄)
}

如果使用的是較早版本,則需在/etc/inetd.conf文件中添加下面的行:

server tcp nowait root /path/to/yourdirectory/server

(3)執行/etc/rc.d/initd.d/xinetd restart重新啟動xinetd伺服器。早期版本執行/etc/rc.d/initd.d/inetd restart重新啟動inetd。

(4)執行netstat -an查看有沒有server程序使用的埠號,如果有就可使用下面客戶機程序進行測試了。

客戶機程序

下面就客戶機函數做一簡單介紹。

//程序名client.c
/*功能:從客戶的控制台輸入一個字元,然後將這個字元送到伺服器,並將伺服器返回的字元顯示出來*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;

函數socket()用於建立一個套介面,創建成功返回套介面描述符。

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(「sockfd error /n」);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(「192.168.0.1」);/*讀者根據自己環境改成伺服器地址*/
address.sin_port=htons(9000);

address_len=sizeof(address);

函數connect()用於與伺服器建立一個主動連接,調用成功返回值為0。

connect_flag=connect(sockfd,(struct sockaddr *)&address,address_len);

if(connect_flag==-1)
{
perror(「client」);
exit(1);
}
printf(「Input a character :」);

函數scanf()用於從控制台輸入一個字元,並將字元存入client_ch的地址。函數write()和read()用於傳輸數據。函數printf()在客戶機屏幕上顯示伺服器傳回的字元。函數close()關閉套介面。

scanf(「%c」,&client_ch);
write(sockfd,&client_ch,1);
read(sockfd,&server_ch,1);
printf(「character from server : %c/n」,server_ch);
close(sockfd);
exit(0);
}

執行命令「gcc -o client client.c」,將client.c編譯成client。執行「./client」,在程序提示下輸入一個字元,就能看到伺服器傳回的字元。

以上介紹的僅是簡單的例子。平時見到的服務程序遠比它復雜,而且很多是多協議服務程序或是多協議多服務程序。多協議服務程序就是在main()中分別創建供服務的TCP和UDP套介面。為每個服務分別寫出相應程序好處是便於控制,但是這樣每個服務都啟動兩個伺服器,而它們的演算法響應是一樣的,就要耗費不必要的資源,並且出了問題排錯也較困難。多服務是將不同的服務集成在一起由一個程序完成,可用一個數組表示服務,數組中的每一項表示某協議某服務的一種,這樣很容易擴展程序的服務功能。

熱點內容
寬頻賬號密碼忘記怎麼辦 發布:2025-03-29 21:12:52 瀏覽:879
nodejs編譯內存需求 發布:2025-03-29 21:08:20 瀏覽:554
編程必讀的 發布:2025-03-29 21:08:19 瀏覽:220
安卓圖片如何提取頭像 發布:2025-03-29 21:08:15 瀏覽:426
中專編程遠 發布:2025-03-29 21:06:09 瀏覽:313
怎麼自學學編程 發布:2025-03-29 20:38:29 瀏覽:208
汽車音響安卓系統怎麼調重低音 發布:2025-03-29 20:37:52 瀏覽:391
遺傳演算法與粒子群演算法 發布:2025-03-29 20:15:51 瀏覽:753
信訪問問 發布:2025-03-29 20:12:12 瀏覽:533
java創建臨時文件 發布:2025-03-29 20:02:06 瀏覽:31