//************************************************************************
// Written by lxx
// May 2009
// Implementation of CIPMessage class and main.
//************************************************************************
#include "chat_server.h"
CChatServer CServerObj;//声明变量
UINT ServerRecThread(LPVOID pParam)
{
SOCKET sRecSocket = (SOCKET)pParam;
while(1)
{// 接收客户端发送的数据
if(CServerObj.RecClient(sRecSocket))
break;
}
return 0;
}
UINT ServerListenThread(LPVOID pParam)
{
// 侦听所有的客户端链接请求
while(1)
CServerObj.StartListenClient();
return 0;
}
CChatServer::CChatServer()
{// 初始化服务器
cout << "Starting up TCP Chat server\n";
m_bIsConnected = false;
WSADATA wsaData;
// 填充sockaddr_in结构
sockaddr_in local;
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
{
return;
}
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)8084);
m_SListenClient=socket(AF_INET,SOCK_STREAM,0);
// 绑定这个套节字到一个本地地址
if(m_SListenClient==INVALID_SOCKET)
{
return;
}
if(bind(m_SListenClient,(sockaddr*)&local,sizeof(local))!=0)
{
return;
}
// 进入监听模式
if(listen(m_SListenClient,10)!=0)
{
return;
}
m_bIsConnected = true;
return;
}
CChatServer::~CChatServer()
{
closesocket(m_SListenClient);
WSACleanup();
}
void CChatServer::StartListenClient()
{
//监听线程管理所有的客户端,一个客户端链接对应一个接收线程
sockaddr_in from;
int fromlen=sizeof(from);
m_SClient=accept(m_SListenClient,
(struct sockaddr*)&from,&fromlen);
if(m_SClient != INVALID_SOCKET)
m_vClientList.push_back(m_SClient);
AfxBeginThread(ServerRecThread,(void *)m_SClient);
}
int CChatServer::SendMessagePort(string sMessage)
{ // 将消息发送给所有的客户端
int iStat = 0;
list<SOCKET>::iterator itl;
if(m_vClientList.size() == 0)
return 0;
for(itl = m_vClientList.begin();itl != m_vClientList.end();itl++)
{
iStat = send(*itl,sMessage.c_str(),sMessage.size()+1,0);
if(iStat == -1)
m_vClientList.remove(*itl);
}
if(iStat == -1)
return 1;
return 0;
}
int CChatServer::RecClient(SOCKET sRecSocket)
{
char temp[4096];
int iStat;
iStat = recv(sRecSocket,temp,4096,0);
if(iStat == -1)
{// 如果端口接收数据失败则将其Socket移除出客户端列表
m_vClientList.remove(sRecSocket);
return 1;
}
else
{ // 将接收的某个客户端的数据打印并广播给所有的客户端
cout <<":"<<temp<<"\n";
SendMessagePort(temp);
return 0;
}
return 0;
}
int main(int argc, char* argv[])
{
int nRetCode = 0;
char buf[4096];
cout << "This is written by lxx.\r\n";
cout << "This aplication act as a chat server.\n";
cout << "Press ONLY ENTER to quit.\n";
cout << "=================================================\n";
if(!CServerObj.IsConnected())
{
cout<<"\nFailed to initialise server socket";
cout<<"\nThis is lxx signing off : Bye";
getch();
return 1;
}
AfxBeginThread(ServerListenThread,0);
// 服务器发送消息给全体客户端
while(gets(buf))
{
if(strlen(buf) == 0)
break;
if(CServerObj.SendMessagePort(buf))
{
cout<<"Problem in connecting to server. Check whether server is running\n";
break;
}
}
cout<<"This is lxx signing off.";
getch();
return nRetCode;
}
没有合适的资源?快使用搜索试试~ 我知道了~
chat_server and chat_client
共20个文件
exe:3个
dsw:2个
plg:2个
2星 需积分: 9 12 下载量 44 浏览量
2010-03-07
14:02:48
上传
评论
收藏 645KB RAR 举报
温馨提示
TCP/IP应用程序工作模型是:使用TCP/IP协议的网络,其协议核心内容在层次结构的低三层,即网络接口层、IP层和传输层,而这三层的功能一般是由操作系统的内核来实现的。TCP/IP协议网络的典型应用方式,即客户/服务器模式。网络程序设计其实是使用系统提供的网络协议完成用户程序的功能,即在网络应用程序中使用网络协议提供的服务,而不是让用户去实现网络协议各层的功能。
资源推荐
资源详情
资源评论
收起资源包目录
chat_server chat_client chat.rar (20个子文件)
chat_server chat_client chat
chat_client
chat_client.dsw 545B
chat_client.h 815B
chat_client.cpp 3KB
chat_client.opt 53KB
chat_client.ncb 57KB
Debug
chat_client.exe 1.36MB
server.ini 9B
chat_client.dsp 4KB
chat_client.plg 502B
chat_server
chat_server.cpp 3KB
chat_server.h 1KB
chat_server.dsp 4KB
chat_server.opt 53KB
chat_server.ncb 57KB
Debug
chat_server.exe 1.36MB
chat_server.dsw 545B
chat_server.plg 502B
Release
chat_server.exe 104KB
~VC18.tmp 53KB
1.doc 159KB
共 20 条
- 1
资源评论
- dzwghx2014-06-05楼主啊,编译不过啊
- dyangko2013-09-21少文件 调不通
sevenchiu
- 粉丝: 9
- 资源: 102
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功