vs平台下的简单telnet服务器代码

  写此文仅此献给给我一样当初做这个任务的时候的迷惑

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的时候注明博客园,谢谢!!!!

时间: 2024-08-25 10:59:29

vs平台下的简单telnet服务器代码的相关文章

Android平台下使用lua调用Java代码经验总结

动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方便扩展,方便嵌入被用于大多数的游戏开发中. 对于我来说.对于一个充分认识到动态的力量的人来说,在软件开发里集成一种脚本语言成为一种非常重要的非常有意义的工作. 可是在Android平台.在试过Python后,发现尽管集成也不是什么困难的事,可是感觉它还是有点大,一个动态库就有3M多,python库还

windows 上的 _splitpath 函数在 linux 平台下的简单实现

在做移植时, 发现了 _splitpath 在 linux 下是没有的,于是决定自己写下,也不难. 首先百科到如下内容: 声明定义 void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); 说明 分解路径,把你的完整路径给分割开来,就是一个对字符串进行分割的函数 参数表 path, Full path(完整路径) drive , Optional drive letter, follo

Linux平台下快速搭建FTP服务器

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload). 一般在各种linux的发行版中,默认带有的ftp软件是vs

cent os下搭建简单的服务器

作为常和网络打交道的程序员,经常会遇到需要服务器的场合,比如搭建一个web服务器,一个代理服务器,又或者一个小型的游戏服务器. 我时常和朋友一起玩一款叫我的世界的游戏,为了能够长期稳定地联机玩,所以特地买了一个服务器.因为windows作为服务器系统,不如Linux稳定,而且linux可以不用GUI界面,内存占用非常小,这样就能让更多的朋友同时在线.相互比较,我选择了Cent OS系统. Cent OS作为一个网络服务器是非常优秀的,稳定而且强大.废话不多说,我们第一步来搭建一个我的世界服务器.

怎么使用瓦特平台下面的“代码工厂”快速生成BS程序代码

这里说一下怎么使用瓦特平台下面的“代码工厂”快速生成程序代码 使用平台:windows+"visual studio 2010"+"SqlServer2000+" 结构:B/S 生成的结构:前端Html和JS.数据库sql,底层ajax,底层数据交互! 免费下载客户端:(永久有效)----------此版本不附带权限控制! http://pan.baidu.com/s/1hqtGGlA 代码生成介绍 1:打开瓦特平台的设计器: 点击提交:出现---> 在你的机

linux下安装Telnet服务器

一般情况Telnet服务在linux下默认是没有安装的,需要手动安装,因为telnet是依赖于超级守护进程的进程,而依赖于超级守护进程的进程一般都会放置在/etc/xinetd.d/这个目录下,独立的进程一般放置到/etc/init.d/rc.d/这个目录下. 安装步骤: 1.挂载光盘镜像 [[email protected] ~]#  mount /dev/cdrom /mnt mount: block device /dev/cdrom is write-protected, mountin

Linux 下 简单客户端服务器通讯模型(TCP)

原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<sys/socket.h> #include<sys/types.h> #include <stdio.h> #include <unistd.h> #inclu

CentOS下架设Telnet服务器

CentOS下架设Telnet服务器1.什么是Telnet?来自度娘的解释:Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接到服务器.终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样.可以在本地就能控制服务器.要开始一个telnet会话,必须输入用户名和密码来登录服务器.Telnet是常用的

分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2