Serv.acceptMessages();
// 得到第一个消息
mMsg = tServ.getMessage();
// 消息不为空
if (mMsg.cMsg[0] != 0)
{ // 得到客户端反馈的消息 uInfo = tServ.getUserInfo(mMsg.nUser); cout<<"打印用户信息"<
char *temp1;
temp1= new char[20];
temp1[0]=0;
strcat(temp1, inet_ntoa(uInfo.user_sin.sin_addr));
cChat[0] = 0; cText = &;cChat[0]; strcat(cText, "From 客户端 (编号: "); cInt[0] = 0; _itoa(mMsg.nUser, cInt, 10); strcat(cText, &;cInt[0]); strcat(cText, ") (IP: "); strcat(cText, inet_ntoa(uInfo.user_sin.sin_addr));//inet_ntoa函数是inet_addr函 数的逆函数,将网络地址转换为点分十进制的字符串 strcat(cText, ") (Port: "); cInt[0] = 0; _itoa((int) ntohs(uInfo.user_sin.sin_port), cInt, 10);//ntohs 即 network to host u_short strcat(cText, &;cInt[0]); strcat(cText, "): "); strcat(cText, &;mMsg.cMsg[0]); cout< tServ.closeEmptySockets();
} // 关闭监听端口 tServ.stopListen(); return 0; }
3、Telnet 类及相关函数文件 TelnetServer.cpp
#include "TelnetServer.h" // 构造函数:缺省 (PORT: 23) (MAX_CONNECTS: 100) (CONNECT_MSG: "已连接。") (SERVER_FULL_MSG: "服务器满...") TelnetServer::TelnetServer() { setServer(23, 100, "你已连接到服务器。", "服务器满..."); } // 设置服务器参数 void TelnetServer::setServer(int nPort, int nMaxConnects, char connectMsg[9999], char serverFullMsg[9999]) { int lcv; // 限制用户数在1-100范围 if (nMaxConnects < 1) { nMaxConnects = 1; } if (nMaxConnects > 100) { nMaxConnects = 100; } PORT = nPort;
MAX_CONNECTS = nMaxConnects;
CONNECT_MSG[0] = 0;
SERVER_FULL_MSG[0] = 0;
sServer = INVALID_SOCKET;
if (connectMsg[0] != 0)
{
strcat(&;CONNECT_MSG[0], &;connectMsg[0]);//"你已连接到服务器。"
}
if (serverFullMsg[0] != 0)//连接已满
{
strcat(&;SERVER_FULL_MSG[0], &;serverFullMsg[0]);
}
user = new USER[MAX_CONNECTS + 5];
for (lcv = 0; lcv < (MAX_CONNECTS + 5); lcv++)//对每个user进行初始化
{
mMsg[lcv].cMsg[0] = 0;
mMsg[lcv].nUser = -1;
}
for (lcv = 0; lcv < (MAX_CONNECTS + 5); lcv++)
{
user[lcv].cName[0] = 0;
user[lcv].cInput[0] = 0;
user[lcv].sUser = INVALID_SOCKET;
user[lcv].user_sin_len = sizeof(user[lcv].user_sin);
}
}
TelnetServer::~TelnetServer()
{
int lcv;
//关闭所有的客户端口
for (lcv = 0; lcv < (MAX_CONNECTS + 5); lcv++);
{
closeClientSocket(lcv);
}
stopListen();
}
// 从队列中回收到来的消息
MESSAGE TelnetServer::getMessage()
{
MESSAGE mMessage;
char *cMsg;
mMessage.nUser = mMsg[0].nUser;
mMessage.cMsg[0] = 0;
if (mMsg[0].cMsg[0] != 0)
{
cMsg = &;mMessage.cMsg[0];
strcat(cMsg, &;mMsg[0].cMsg[0]);
}
for (int lcv = 0; lcv < 99; lcv++)//将整个消息队列向前移一位
{
mMsg[lcv] = mMsg[lcv + 1];
}
return mMessage;//mMessage中有用户号和消息的内容
}
// 开始监听连接
int TelnetServer::startListen()
{
if (WSAStartup(MAKEWORD(1,1), &;WSAData) != 0) { return -1; }
if ((sServer = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { return -1; }
server_sin.sin_family = AF_INET;
server_sin.sin_port = htons (PORT);
server_sin.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(sServer, (struct sockaddr *) &;se