Skip to content

Latest commit

 

History

History
331 lines (261 loc) · 9.55 KB

README.md

File metadata and controls

331 lines (261 loc) · 9.55 KB

CShell Linux网络编程大作业

介绍

这是咱的网络编程大作业 基于Select的群聊和Telnet控制

软件架构

CShell

文件

源文件

  • Server.c
  • Client.c


























编译

  • gcc -std=c99 Server.c -o Server
  • gcc -std=c99 Client.c -o Client


























使用说明

启动

  1. 启动服务端 ./Server [IPV4] [ListenPort]

Example

./Server 100.2.169.8 9190


开启服务端
  1. 开启客户端 ./Client [IPV4] [Port] [YourName]

Example

./Client 100.2.169.8 9190 锦龙


客户端连接


























群聊功能

在此之前,再打开一个客户端,重复之前操作即可

直接键入消息,摁下回车,即默认为发送聊天信息


聊天功能


























telnet远程控制功能

$使用

$ 代表服务端要处理的命令

格式    $[Command]
前缀 命令 作用
$ ls 列出已经连接服务端的客户端详情

Example $ls

可以知道客户端这些信息 iP地址、端口号、SockNum(套接字号)、名字


$ls功能展示

不必在意为啥第一个地址是 0.0.0.0 0,我试了很多次,每次第一个地址都是0,大概因为我是在本机测试的。请放心,该程序已经在局域网的多台机器上测试过。


























:使用

:代表远程客户端要执行的命令

  1. 指定要连接的客户端

用法 :telnet [sockNum] [password]

Example

:telnet 4 password

注意:4$ls中获取的,password是密码


telnetOpen
  1. 开始控制远程客户端

需要注意一点,执行这些命令大部分都要加一个后缀 > cmd.txt


























  • Linux下常用的命令

Example

:pwd > cmd.txt


pwd展示

Example

:ls > cmd.txt


:ls的返回与真实目录对比


























  • 自定义的命令
前缀 命令 使用 作用
: fetch :fetch [filename] 获取远程客户端的文件
: push :push [filename] 将本地的文件发送给远程客户端

Example

:fetch li.jpg

可以自己对比两个文件,看一下是否一样。


fetch

Example

:push fetch.png

把当前目录下的fetch.png发送出去,当然也可以指定路径。


push



























  • 我测试过的一些Linux常用命令,以Centos 为例
前缀 命令 作用 后缀
: reboot 重启 > cmd.txt
: shutdown -P 关机 > cmd.txt
: ps -A 显示所有进程信息 > cmd.txt
: ps -ef 显示所有进程信息,包括命令的绝对路径 > cmd.txt
: kill [pid] 杀死对应进程号的进程 > cmd.txt
: kill -9 [pid] 强制杀死对应进程号的进程 > cmd.txt
: yum install -y cowsay 安装cowsay,一款命令行软件 > cmd.txt
: cowsay [内容] 亲测,比较好玩 > cmd.txt
: cowsay -l 列出其它动物 > cmd.txt
: cowsay -f [-l列出的动物名] [内容] 选择一种 > cmd.txt


























其它

看完前面,大致上你可以知道软件是如何使用了,下面我说一说原理和遇到的难题,以及可以做一些有趣的事情。有兴趣的可以接着看。

问题

  1. 为什么要加前缀?
  2. 为什么要加后缀?
  3. 客户端是如何执行命令的?
  4. Select的客户端使用,解决键盘输入和接收服务端信息问题
  5. Server的Select使用
  6. 处理各种字符串问题,解析字符串

回答

  1. 前缀,当然是为了区分服务端命令、客户端命令、普通群聊消息。好让服务器以此转发。
  2. 后缀,本质上是为了存储命令行的执行结果
  3. 有些函数可以执行系统级的命令,如system(char * command)。如果有输出,我就将结果保存到cmd.txt上,使用重定向符 > cmd.txt
  4. Select客户端


Select客户端的大循环


Shell内部简介
  1. Server的Select使用


Server的Select使用


socket_handling