利用流套接字實現乙個簡單的遠端控制系統

2021-10-03 08:23:39 字數 4258 閱讀 6698

實驗要求

客戶端輸入「quit」,客戶端程式與伺服器端程式列印退出資訊,終止程式的執行;

客戶輸入命令,客戶端將命令通過流套接字傳送給客戶端,伺服器執行收到的命令,並將結果傳送到客戶端顯示;

如果沒有客戶輸入的命令,伺服器傳送命令非法資訊,並在客戶端顯示該條資訊;

伺服器端可以接收客戶端多次連線,能夠處理客戶端非正常退出。

實驗環境

red hat 9

**tcpserver.c

#include

#include

#include

#include

#include

#include

#include

#include

#define port 8900

#define buf_size 2048

intexecute

(char

* command,

char

* buf)

;int

main()

memset

(&server,0,

sizeof

(struct sockaddr_in));

server.sin_family = af_inet;

server.sin_addr.s_addr =

htonl

(inaddr_any)

; server.sin_port =

htons

(port);if

(-1==

bind

(sockfd,

(struct sockaddr*

)&server,

sizeof

(struct sockaddr)))

if(-1

==listen

(sockfd,10)

) length =

sizeof

(struct sockaddr_in)

;while(1

)while(1

)//change

recv_buf[recvnum]

='\0';if

(0==strcmp

(recv_buf,

"quit"))

//attention!!!

strcpy

(cmd,

"/bin/");

strcat

(cmd,recv_buf)

;execute

(cmd,send_buf);if

('\0'

==*send_buf)if(

'\0'

==*send_buf)}if

('\0'

==*send_buf)

sprintf

(send_buf,

"command is not vaild,check it please\n");

printf

("%s\n"

,send_buf)

; sendnum =

send

(connected,send_buf,

sizeof

(send_buf),0

);//changeif(

0>sendnum)

}close

(connected);}

close

(sockfd)

;exit(1

);}int

execute

(char

* command,

char

* buf)

count =0;

while((

(buf[count]

=fgetc

(fp))!=

eof)

&&count<

2047

) count++

; buf[count]

='\0'

;pclose

(fp);if

(0==count)

printf

(buf,

"%s cannot execute\n"

,command)

;return count;

}

tcpclient.c
#include

#include

#include

#include

#include

#include

#include

#define port 8900

#define buf_size 2048

void

print_usage

(char

* str)

intmain

(int argc,

char

** ar**)

memset

(send_buf,0,

2048);

memset

(recv_buf,0,

2048);

port = port;if(

-1==(sockfd=

socket

(af_inet,sock_stream,0)

))// change

memset

(&server,0,

sizeof

(struct sockaddr_in)

);

server.sin_family = af_inet;

server.sin_addr.s_addr =

inet_addr

(ar**[1]

);server.sin_port =

htons

(port);if

(-1==

connect

(sockfd,

(struct sockaddr*

)&server,

sizeof

(server)))

//change

while(1

)if(0

==strcmp

(send_buf,

"quit"))

length =

sizeof

(struct sockaddr)

; recvnum =

recv

(sockfd,recv_buf,

2048,0

);if(

0//change

else

}close

(sockfd)

;exit(1);}

執行結果

將服務端與客戶端啟動,本實驗中黑底是服務端,白底是客戶端,編譯後的可執行檔案分別命名為 tcpserver 和 tcpclient

先測試命令ls,在客戶端輸入ls回車,傳到服務端執行命令,然後服務端將結果返回給客戶端並顯示在控制台,如下兩圖:

再測試whoami命令,客戶端輸入whoami,傳到服務端執行,然後服務端將結果返回給客戶端並顯示在控制台,如下兩圖:

測試命令ctrl+c,在客戶端按ctrl+c,客戶端斷開連線退出程式,但服務端仍執行著。之後再重新啟動客戶端,重新連線,如下兩圖:

測試命令quit,客戶端輸入quit,兩邊都退出程式,如下兩圖

乙個簡單的TCP套接字程式設計例項

採用乙個伺服器程式對應乙個客戶的方法,伺服器不需要採取任何併發技術,執行tcp套接字服務端的基本過程是建立套接字,繫結套接字,監聽,接收請求,讀 寫資料和終止連線。伺服器源程式 include include include include include include include inclu...

利用boost asio實現乙個簡單的伺服器框架

boost asio是乙個高效能的網路開發庫,windows下使用iocp,linux下使用epoll。與 不同的是,它並沒有提供乙個網路框架,而是採取元件的方式來提 用介面。但是對於常見的情況,採用乙個好用的框架還是能夠簡化開發過程,特別是asio的各個非同步介面的用法都相當類似。受到 sp se...

利用陣列實現乙個簡單的棧

package com.stack 用陣列實現乙個簡單的棧 方法 壓入元素 push 彈出棧頂元素 pop 棧的大小 size 棧是否為空 isempty public class arraytostack 向棧中新增元素 param item public void push item item ...