判题系统

C#-JudgeSystem判题系统-C#编译C程序

99封情书 提交于 2019-12-10 17:48:35
运行环境: vs2013 框架: .net4.5 c编译器:mingw 32位 首先我们下载一个c编译工具链 http://tdm-gcc.tdragon.net/download 选择tmd gcc 32位编译器下载 配置好后我们就可以使用该编译器对c程序进行编程 尝试写个简单的c代码测试一下编译   保存为test.c 通过工具链的gcc程序进行编译 通过类似gnu gcc的方式进行编译 可以正确运行出结果 测试c编译器可用的情况下我们尝试使用c#进行外部调用 在原先的项目中添加ExeExecute项目 要调用外部的exe程序我们需要引入 using System.Diagnostics; 而要使用外部exe主要是掌握Process对象的使用 Process p = new Process(); 而使用Process主要分为三个步骤,第一步是设定启动参数,第二步是启动exe程序,第三步是捕抓程序的输入输出流进行控制 然后第一步的参数设置: 确定编译器对象为gcc.exe p.StartInfo.FileName = @"C:\Users\Administrator\Desktop\gcc-5.1.0\bin\gcc.exe"; gcc程序不在相同路径下需要使用完整路径 设定好程序路径我们还需要设定工作路径,也就是源代码以及生成程序代码的路径 p.StartInfo

C#-JudgeSystem判题系统-客户端和多线程

隐身守侯 提交于 2019-12-10 17:48:23
  运行环境: vs2013 框架: .net4.5 上次实验中已经实现了单线程下的socket的tcp服务器 由于使用浏览器并不能直观的显示socket之间的交互相应,所以这次实验我们先完成客户端部分的编程再进行服务端编程的完善 同样的先建立好一个新的项目 客户端部分需要两个操作才能成功连接 套接字建立部分与服务端一致 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 然后就是进入连接部分 先建立待连接的ip与端口对象 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7777); s.Connect(ipe); 知道这些后我们编程实现一下连接功能 编码完成进行一下测试,先启动我们的server程序等待连接 再打开client程序请求连接 此时我们观察到两个程序直接已经通过socket建立通信 此时再完善客户端的读写操作 对于客户端而已读写操作跟服务端是没有任何区别的,本质是这个阶段并不区分客户端与服务端,其读写是对等的 s.Send(buf, buf.Length, SocketFlags.None); bytes = s.Receive(buf, buf.Length,

C#-JudgeSystem判题系统-判题系统

我们两清 提交于 2019-12-10 17:48:13
运行环境: vs2013 框架: .net4.5 上一次实验已经完成了判题核心的封装,接下来就是通过服务器后台调用判题系统对客户端传来的数据进行判断 根据前面的一些测试我们建立新的解决方案来实现完整的判题系统 首先第一步我们先确定客户端和服务器的交互流程 客户端的数据有三个:源代码,输入,输出 这时候到底怎么传到服务器的,有两个方法,一个是一次性传输,一个是分三次传输 一次性传输的话就要面临怎么切割这三种数据,必须定义一个分割符,而且数据也要面临转义的问题,到了服务器也需要进行解译,这样会消耗一定的资源 但到底这三个数据是不是一定要一次性传输呢?其实并不用,因为这三个数据作用于不同阶段并且可以单独分割开来,所以分三次传输其实是可以的,并且每个阶段都可以根据回传来判断判题的状态,出现错误是可以减少后面两次的传输,节省一定的宽带与内存 server cilent send:源代码 read:源代码 compile:源代码 send:编译结果 read:编译情况 如果成功 send:输入 read:输入 run:输入 send:运行情况 read:运行情况 如果程序成功运行结束未超时 send:输出 read:输出 比较输出 send:结果 read:结果 close close 做好流程设计后开始编码程序 由于把输入输出分离,所以类库接口需要改变适配,类库改变的成本较低

C#-JudgeSystem判题系统-安装和熟悉C#开发环境

允我心安 提交于 2019-12-10 17:48:01
由于该项目属于已完成项目,过程实验报告均以提交,这里一次性提交到博客中分享一下 新建一个wpf项目,命名为HTTPServer 点击MainWindow.xaml可以进入xaml的设计器环境 在设计器环境中我们可以通过下方的xaml代码编辑器进行界面修改 也可以通过右侧工具箱拖拉控件调整位置 根据实验要求我们先拖放两个文本框 然后我们还需要添加两个多行文本框 拖拉完成后我们需要进行对文本框的换行属性进行编辑 我们可以直接修改xaml或者在右侧控件属性中修改 在属性框上方的搜索框中输入相关的可修改属性可以快速找到修改项 找到图中TextWrapping属性可以进行修改,wrap代表可换行,nowrap不换行 而一些其他类型的属性可以按需求进行修改,增加enter换行等属性 除了通过图形界面进行拖拉勾选编辑,我们还可以直接编写xaml代码 与xml相似的格式,我们可以在一行中添加删除属性来修改textbox的属性,不存在的则以默认值来规约 比如上面修改换行属性我们可以直接添加TextWrapping="Wrap",Wrap值可以修改 理解wpf中xaml的界面编辑方式,我们可以继续完成该实验,把控件全部写上并且调整好位置 固定好控件的分配,开始修改控件的默认显示,比如修改标题,label,以及textbox的默认文字显示 修改完成后初步完成界面的设计 下一步开始处理控件的相应

C#-JudgeSystem判题系统-开放实验总结

我是研究僧i 提交于 2019-12-10 17:47:50
花了一周的时间去做这个实验中间断断续续完成不同的部分,按照实验过程来一步一步完成感觉实验流程还是相当合理的 上图就是最后的成品,其中包括 JudgeCilent客户端 完成部分: 1、可以提供五种测试状态的显示,包括网络异常,编译失败,输入错误(超时),结果错误,接受,五个状态 2、可以对无输入程序进行测试 3、可修改ip地址与端口 可提高部分: 1、由于该程序只是辅助测试服务器的使用的,所以并没有做一下界面的优化比如线程运行优化来避免等待服务器返回时界面不响应的现象 JudgeServer服务器 完成部分: 1、错误处理,并测试在判题过程的几种意外下能正常运行,以及客户端无连接后会在30秒超时时主动断开连接避免系统空连接过多造成的系统开销 2、多线程处理,在并发速度为10ms一次连接下,并且带有不同的错误情况下,系统依然能正确运行,高并发下测试判题并没有错误 可提高部分: 1、服务器与客户端的交互仍有不完善的地方,一是不方便拓展,一旦服务器修改,客户端必须进行修改,因为数据是按照一定规则分次发送的,而不是结构化一次性发送 2、暂时没有提供自定义的监听端口与gcc编译程序地址与test编译测试工作目录,这里通过相对地址也就是如图的两个文件夹存放,监听地址固定为8080而没有设置成运行时确定 CompileTest编译类库 完成部分: 1、编译与测试输入输出结果,无输入则通过\r

C#-JudgeSystem判题系统-一个简单的HTTPServer

我的未来我决定 提交于 2019-12-10 17:36:17
在原来的HTTPServer项目解决方案中添加新的控制台SocketServer项目 添加新的项目后可以看到解决方案中有两个项目 建立好项目后我们可以进行编程 进行编程前我们需要了解c# socket编程以及http的规范 1.socket编程 首先我们决定使用tcp协议,拿到一张socket的tcp连接过程 第一个建立一个c# socket套接字对象: Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 其中对象构造函数需要传入三个对象用于建立合适的socket连接 AddressFamily.InterNetwork代表使用ipv4协议 SocketType.Stream基于流 ProtocolType.Tcp协议为TCP 建立socket对象后我们需要绑定ip和端口: ip使用0.0.0.0作为监听端口 port使用7777作为监听端口 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 7777); 第三步是注册监听端口: s.Listen(0); 第四步是进入接受状态: Socket temp = s.Accept(); 此时程序阻塞等待客户端连接 连接成功程序才能继续执行