急急急!一个简单的协议编写问题。。。
以下是老师给我们的要求:
五子棋对战程序通信协议
五子棋程序采用socket作为进程间通信的方式,编程者应当使用GCC/VC或其它支持
socket的编译环境开发程序。
当对局时,有一个裁判进程和两个对局进程同时运行于一台主机上,学生在实习过程
中负责编写对局程序。
1. 对于每一个对局程序,启动后都需要连接到裁判程序,裁判程序的端口号作为
参数传递给对局程序。
2. 对局程序在连接到裁判进程后,裁判进程向其发出initial命令,命令的参数为棋
盘的大小和每一步棋允许耗费的时间。棋盘的大小用行数和列数表示,耗费的时间用
秒作为计数单位。这三个数字之间用空格分隔。对局程序收到initial命令后,应在
15秒内发送ready命令,以此表示自己已经准备完毕。
3. 裁判进程向应当走棋的一方发送run命令,其参数为发出命令时的主机时间,并向
另一方发送wait命令。
4. 当决定了下一步的位置之后,正在走棋的对局程序需要发送step命令以传送棋子
的位置。如果不再修改,就发送over命令,表示此轮结束。裁判程序在收到over命令
后发送wait命令,并开始和另一方的对局程序通信。step命令可以多次发送,如果对
局程序没有在规定的时间内发送over命令,则裁判进程在时间到后则以最后一次的
step为准,并连续发送timeout和wait命令。如果在规定的时间内裁判进程都没有收
到step命令,则随意为该方走一子,并通过timeout命令告知。timeout的参数是裁判
程序收到的最后一次step的位置或者随意走的子的位置。
5. 裁判进程在收到走棋方的step/over命令后,将step转发给另外一方,并发送run
命令,另外一方开始走棋。
6. 若某一方主动认输,发送surrender命令给裁判进程,若裁判进程收到surrender
命令或已经可判定出胜负,则同时给双方发送end win/lose命令,双方程序退出。
全部命令列表
--> initial 行数 列数 每一步的秒数
<-- ready
--> run 开始计时的时间
<-> step 行 列
<-- over
--> timeout 行 列
--> wait
<-- surrender
--> end (win|lose)
右箭头表示裁判程序给对局程序,左箭头表示对局程序给裁判程序。
其它说明:
1. 当读写socket时,应使用阻塞的方式。
2. 程序内部可以使用多线程,但不可以使用多进程。
3. 当一方走棋时,裁判程序应暂时降低另一方程序的优先级。
4. 对局程序的第一个参数为裁判机的端口号。
5. 对局程序若在运行过程中异常终止则判输。
过程示例
裁判程序 对局程序1 对局程序2
initial------------->
initial------------------------------>
<-------------ready
<------------------------------ready
wait--------------------------------->
run----------------->
<-------------step
<-------------step
<-------------over
wait---------------->
step--------------------------------->
run---------------------------------->
<------------------------------step
timeout------------------------------>
wait--------------------------------->
step---------------->
run----------------->
...
...
<-------------surrender
end win------------------------------>
end lose------------>
我之前尝试着编写了一番,但是遇到了很多问题,比如在连接服务器时出现10061错误,没解决此问题的前提下调用send()和recv()函数又出现了10038错误。。。打击太大了!!!
想请大家推荐些你们解决此问题的办法,愿高分献出!
我在看windows网络编程那本书的时候,仔细研究了一下c/s模式的例子,实在不懂那个ValidateArgs(int argc,char **argv)函数是干什么用的!