急急急!一个简单的协议编写问题。。。

xiaoyuwawa 2005-09-11 11:50:19
以下是老师给我们的要求:


五子棋对战程序通信协议
五子棋程序采用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)函数是干什么用的!
...全文
97 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
i_noname 2005-09-12
  • 打赏
  • 举报
回复
10022错误:
The socket has not been bound to an address with bind
=====================================================

没有连接成功之前用getsockname是没意义的。
先设好client.sin_addr.s_addr,然后connect。
xiaoyuwawa 2005-09-12
  • 打赏
  • 举报
回复
以下是我编写的客户端程序:

#include "winsock2.h"
#include "stdlib.h"
#include "stdio.h"
#pragma comment(lib, "ws2_32.lib")

int main()
{

WSADATA wsd;
SOCKET client;
char host[20];
int len=sizeof(host);

struct sockaddr_in server;
int se_len=sizeof(server);

int t;

if(WSAStartup((WORD)(1<<8|1),&wsd))
{
printf("error1\n");
return 1;
}

client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(client==INVALID_SOCKET)

printf("套接字创建失败!错误码:%d\n",GetLastError());


gethostname(host,len);

hostent* pHostent=gethostbyname(host);

hostent &he=*pHostent;

if(pHostent==NULL)

printf("调用主机信息出现错误,错误码为:%d",GetLastError());

else

printf("name=%s\n",he.h_name);

for(int i=0;he.h_addr_list[i];i++)

memcpy(&server.sin_addr.s_addr, he.h_addr_list[i],he.h_length);

server.sin_family=AF_INET;

unsigned int port;

scanf("%d",&port);

server.sin_port=htons(port);

struct sockaddr_in sa;
int sa_len=sizeof(sa);

t=getsockname(client,(struct sockaddr *)&sa,&sa_len);

if(t==0)

printf("调用成功!\n");
else
printf("调用失败,具体错误:%d\n",GetLastError());*/

printf("%s\n",host);

printf("%s\n",inet_ntoa(server.sin_addr));

printf("%d\n",server.sin_port);

if(connect(client,(struct sockaddr *)&server,se_len)==SOCKET_ERROR)

printf("ERROR :%d\n",GetLastError());

else

printf("ok\n");

getchar();
getchar();


closesocket(client);
WSACleanup();


return 0;

}

在我调用getsockname()时,返回10022错误

再调用connect()时返回10061错误

分别意味着什么啊?

愁死我了!
nuaawenlin 2005-09-12
  • 打赏
  • 举报
回复
连接的时候,服务器有没有开呀?
xiaoyuwawa 2005-09-12
  • 打赏
  • 举报
回复
i_noname(晚九朝五) 你说的client.sin_addr.s_addr不可能亚,client只是一个套接字,而不是sockaddr_in得结构!

返回10061错误就是因为这个么?可是我在客户端程序里是已经初始化了server这个sockaddr_in结构的亚,是哪里错了?
xiaoyuwawa 2005-09-12
  • 打赏
  • 举报
回复
server.sin_family=AF_INET;

unsigned int port;

scanf("%d",&port);

server.sin_port=htons(port);


memcpy(&server.sin_addr.s_addr, he.h_addr_list[i],he.h_length);

这个不是已经对sockaddr_in结构的server设置好了么?
xiaoyuwawa 2005-09-12
  • 打赏
  • 举报
回复
没人帮解决么?
我现在最想解决的是连接问题。
再调用connect()函数的时候会返回10061错误

这个错误没解决了,我强行在接下来调用send和recv函数,返回了10038错误。

希望有经验的大哥大姐们帮我解决以下这两个问题,现在很烦阿!
xiaoyuwawa 2005-09-11
  • 打赏
  • 举报
回复
有愿意帮我解决的请加我qq:66208087

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧