模擬乙個簡單的基於tcp的遠端關機程式

2021-09-06 01:55:28 字數 3943 閱讀 6621

最近在學習unix網路程式設計,現在正在學習tcp的通訊。其實,只要建立起了tcp通訊,操作遠端的計算機就不是什麼問題了。正向telnet一樣,也是基於tcp/ip協議的。所以這個實驗,也算是對telnet功能的一種簡單的模擬。

但是,值得注意的問題是關機涉及到系統許可權,所以要給執行在server端的程式以足夠的許可權,這樣才可以在接收到client端的關機請求時,執行關機。

將會模擬如下執行過程:

1. 執行 mytelnet 跟上引數telnet伺服器 ip位址 127.0.0.1

2. 輸入login 向伺服器請求登入,隨之伺服器會要求輸入密碼

3. 輸入乙個錯誤的登入密碼 123 

4. 伺服器驗證不通過,所以返回fail to login ,please check your password

5. 再次輸入密碼,這次輸入正確的密碼123456

6. 伺服器驗證通過,此時客戶端可以執行基於telnet的遠端操控

7. 輸入操控命令,例如關機命令shutdown 

8. 伺服器將會執行shutdown 操作。

在編譯時使用如下的命令:

server:

sudo gcc server.c -o server //足夠的許可權

sudo chmod u+s server 

./server

client:

gcc client.c -o mytelnet

./mytelnet 10.3.1.210

client端:

#include 

<

stdio.h

>

#include

<

string

.h>

#include

<

arpa

/inet.h

>

#include

<

netinet/in

.h>

#include

<

sys/

socket.h

>

#define

maxline 4096

void

clientwork(file

*fp ,

intsockfd)

}int

main(

intargc ,

char**

argv )

memset(

&servaddr , 0,

sizeof

( servaddr ) );

servaddr.sin_family

=af_inet;

servaddr.sin_port

=htons(

2000

);//

指定server端的埠號

char

*serveraddress

=argv[1];

//判斷指定的ip位址是否有錯誤

if( inet_pton( af_inet ,serveraddress ,

&servaddr.sin_addr )

<=0)

if( connect( sockfd , (

struct

sockaddr *)

&servaddr ,

sizeof

( servaddr ) )

<0)

//從terminal中讀取使用者輸入的指令

clientwork(stdin,sockfd);

close(sockfd);

return0;

} server端:

#include 

<

stdio.h

>

#include

<

string

.h>

#include

<

arpa

/inet.h

>

#include

<

netinet/in

.h>

#include

<

sys/

socket.h

>

#define

maxsize 1024

#define

login 1

//登入server

#define

bye 2

//離開server

#define

pass 3

//合法登入

#define

deny 4

//非法登入

#define

shutdown 5

//執行關機

#define

error -1

//非法資訊

//記錄狀態資訊

static

intstate=0

;int

getclientchoice(

char

*clientmsg)

if(state

==login)

if(state

==pass)

return

error;

};//

傳送訊息

void

sendmsg(

intsockfd,

char

*buffer,

char

*msg)

//定義關機函式

void

myshutdown()

intmain(

intargc ,

char**

argv )

else

//對listenfd進行監聽,從最初建立時的主動套介面(用於進行connect的套介面)轉化為被動套介面(接受連線)

listen(listenfd,

100);

//第二個引數為套介面排隊的最大連線個數

intconnectfd;

socklen_t addrlen;

struct

sockaddr_in connectaddr;

memset(

&connectaddr,0,

sizeof

(connectaddr));

printf(

"be ready to accept a connection!\n");

while(1

)else

if(clientchoice

==pass

&&state

==login)

else

if(clientchoice

==shutdown

&&state

==pass)

else

if(clientchoice

==bye)

else

if(clientchoice

==deny)

else

if(clientchoice

==error)

}close(connectfd);

}close(listenfd);

//雖然因為上面有while(true),這行永遠都執行不了,但是時刻注意關閉socket連線應該是個好習慣。

return0;

}

基於tcp的簡單遠端併發控制系統

編寫語言 c 編譯環境 linux 老師布置了關於遠端控制系統的改進,使服務段與多個客戶端能夠併發通訊。在這個系統的操作中,客戶端連上服務端之後,向服務端傳送簡單的控制指令,服務端收到控制指令後,進行處理,並將處理結果返回給客戶端。1.服務端 include include include incl...

Python 基於Redis實現乙個簡單的分布式鎖

redis lock.py import redis import time import threading 連線池方式 pool redis.connectionpool host 127.0.0.1 port 6379 redis con redis.redis connection pool...

基於arm的乙個簡單的led驅動

在學寫驅動的時候一定不要盲目的跟從,要有自己的方法。要記住一點,學習驅動要學習驅動的模板,每個驅動程式其結構基本上都是一樣的。只要大家掌握了驅動的結構以後在寫驅動的時候就相對來說要簡單一些。只要大家學會寫驅動過後後頭來看其實驅動都是大同小異的。在這裡我給大家介紹乙個簡單的led驅動的寫法,defin...