标签:
写此文仅此献给给我一样当初做这个任务的时候的迷惑
1.要求写一个可以在windos用telnet链接的小型服务器
因为接触的网络知识很少,再加上1年没用过c++, VS下开发的经验少之又少,所以一开始无从下手,废话少说进入主题
1)首先我也是百度了telnet服务器源码,看了很多都不是太懂,后来没办法决定直接用百度文库招到的以下是链接http://wenku.baidu.com/link?url=QRBlQQSlQxeVRklVmkhAnjvFgs3O36zy09P5nz9CY8IWBhJb9uSgfNz2L1ytKrktj9l5yOMJLybX9ZOGUeR9RENcQ2_1GzcxxAEjKJgCtNa
但是我运行时不成功的,所以没办法,一行一行去看。
2)调试过程中遇到strcat是不能用的,没办法,用strcat_s代替,消除了所有警告与错误,发现还是有问题,原来是acceptMessages是在telnet链接下是不行的,以下是我修改后的acceptMessages函数,另外新增了get_input_cmd函数
代码如下:
void TelnetServer::acceptMessages()//检查每个用户是否有输入,并将其输入放到消息队列中
{
int nMsg, lcv, lcv2;
u_long lMsg;
for (lcv = 0; lcv < MAX_CONNECTS; lcv++)//lcv代表的是用户的标号,循环判断每一个用户的信息
{
nMsg = ioctlsocket(user[lcv].sUser, FIONREAD, &lMsg);//The ioctlsocket function controls the I/O mode of a socket.
if ((nMsg == 0) && (lMsg > 0))
{
memcpy(user[lcv].cNote, user[lcv].cInput, USE_SIZE);
get_input_cmd(user[lcv].sUser, user[lcv].cInput);
lcv2 = 0;
while (mMsg[lcv2].cMsg[0] != 0) { lcv2++; }//在消息队列中查找第一个可以用的消息空位
mMsg[lcv2].nUser = lcv;
memset(mMsg[lcv2].cMsg, 0, USE_SIZE);
memcpy(mMsg[lcv2].cMsg, user[lcv].cInput, USE_SIZE);
}
}
}
void TelnetServer::get_input_cmd(SOCKET sClient,char *rec )
{
char *recvbuf = (char *)malloc(USE_SIZE);
memset(recvbuf, 0, USE_SIZE);
while (1)
{
char fx[BUFF_SIZE]; memset(fx, 0, BUFF_SIZE);
char *p;
p = recvbuf;
recv(sClient, fx, sizeof(fx), 0);
recvbuf[0] = fx[0];
p++;
/*接收客户端发来的命令*/
while (1)
{
recv(sClient, p, sizeof(p), 0);
if (*p == ‘\r‘)break;
else if (*p == ‘\b‘)
{
char BS[3];
BS[0] = 46;
BS[1] = 8;
BS[2] = ‘\0‘;
send(sClient, BS, sizeof(BS), 0);
p--;
}
else p++;
int STRLEN = strlen(recvbuf);
//printf("数组buf为:%s;数组长度为:%d.\n", recvbuf, STRLEN);
}
*p = ‘\0‘; /*末尾补‘\0‘,命令接受完毕!*/
break;
}
memset(rec, 0, USE_SIZE);
memcpy(rec, recvbuf, USE_SIZE);
}
3)基本上最大的改动如上2个函数,当然其他的不改也是可以运行的,代码里面很多直接数字写的,我改成了define
4)然后修改了main函数的while(1)里面的东西,这里根据个人需求修改即可
我的可以拿来给你参考
while (1)
{
// 接受连接
tServ.acceptConnects();
// 接受到来的消息
tServ.acceptMessages();
// 得到第一个消息
mMsg = tServ.getMessage();
// 消息不为空
if (mMsg.cMsg[0] != 0)
{
cout << "come on baby" << mMsg.cMsg << endl;
// 得到客户端反馈的消息
uInfo = tServ.getUserInfo(mMsg.nUser);
// 比较是否输入的指令是new
if (strcmp(uInfo.cNote, "new") == 0 )
{
tServ.sendUser(mMsg.nUser, "创建成功,欢饮来到yesgames,请输入south、north、east、west>> ");
}
else if (strcmp(uInfo.cInput, "new") == 0)
{
// 发送该消息到对应的用户
tServ.sendUser(mMsg.nUser, "请输入创建账号 ");
}
else if (uInfo.cNote[0]!=‘\0‘ && strcmp(uInfo.cInput, "south") == 0)
{
tServ.sendUser(mMsg.nUser, "你现在位于南方 ");
}
else if (uInfo.cNote[0] != ‘\0‘ && strcmp(uInfo.cInput, "east") == 0)
{
tServ.sendUser(mMsg.nUser, "你现在位于东方 ");
}
else if (uInfo.cNote[0] != ‘\0‘ &&strcmp(uInfo.cInput, "west") == 0)
{
tServ.sendUser(mMsg.nUser, "你现在位于西方 ");
}
else if (uInfo.cNote[0] != ‘\0‘ && strcmp(uInfo.cInput, "north") == 0)
{
tServ.sendUser(mMsg.nUser, "你现在位于北方 ");
}
else if (strcmp(uInfo.cInput, "north") && strcmp(uInfo.cInput, "south") == 0)
{
tServ.sendUser(mMsg.nUser, "恭喜完成新手引导 ");
}
else if (strcmp(uInfo.cInput, "west") && strcmp(uInfo.cInput, "east") == 0)
{
tServ.sendUser(mMsg.nUser, "恭喜完成新手引导 ");
}
else if (strcmp(uInfo.cInput, "east") && strcmp(uInfo.cInput, "west") == 0)
{
tServ.sendUser(mMsg.nUser, "恭喜完成新手引导 ");
}
else if (strcmp(uInfo.cInput, "south") && strcmp(uInfo.cInput, "north") == 0)
{
tServ.sendUser(mMsg.nUser, "恭喜完成新手引导 ");
}
else tServ.sendUser(mMsg.nUser, "输入错误: ");
}
// 释放和已经断开的客户端的连接的socket
tServ.closeEmptySockets();
}
希望对需要的朋友有所帮助,也希望跟我一样出入学习网络的朋友一起交流学习QQ125871289,希望加QQ的时候注明博客园,谢谢!!!!
标签:
原文地址:http://www.cnblogs.com/RoboWang/p/5383534.html