#include <cstdio>
#include <cstring>
#include <vector>
#include "winsock2.h"
using namespace std;
#define HOST_ADDRESS "127.0.0.1"
#define HOST_PORT 8888
#define DEFAULT_BUFFER 4096
//客户连接池,保存各个客户的连接
vector<SOCKET> clients;
//结构object 保存每个客户端socket 及对应 地址结构sockaddr_in ,保存地址信息是因为显示信息时
//要标明是谁发表的信息
typedef struct
{
SOCKET sock;
sockaddr_in addr;
} object;
//对于每个客户端的信息处理线程,先获取信息,在通过线程池向各个线程发送信息
DWORD WINAPI clientThread(LPVOID lpParam)
{
object* obj = (object*)lpParam;
SOCKET sock = obj->sock;
char buf[DEFAULT_BUFFER] = "";
char sendback[DEFAULT_BUFFER] = "";
int ret, left, idx = 0;
//循环处理客户端发送的信息
while(1)
{
ret = recv(sock, buf, DEFAULT_BUFFER,0);
if(ret == 0)
return 1;
if(ret == SOCKET_ERROR)
{
printf("receive message failed:%d\n",WSAGetLastError());
return 1;
}
buf[ret] = '\0';
sprintf(sendback, "[%s said]:%s\n",inet_ntoa(obj->addr.sin_addr),buf);
printf("[The message from %s]:%s\n", inet_ntoa(obj->addr.sin_addr), buf);
printf("[The sendback message is]: %s\n", sendback);
//向各个客户端发送通告信息
for(int i=0; i < clients.size(); i++)
{
left = strlen(sendback);
while(left > 0)
{
ret = send(clients[i], &sendback[idx], left, 0);
if(ret == 0)
return 1;
else if( ret == SOCKET_ERROR)
{
printf("send back message failed:%d\n",WSAGetLastError());
return 1;
}
left -= ret;
idx += ret;
}
idx = 0;
}
memset(buf, 0, DEFAULT_BUFFER);
memset(sendback,0, DEFAULT_BUFFER);
}
return 0;
}
int main()
{
WSADATA data;
SOCKET listenSocket;
sockaddr_in serverAddr;
sockaddr_in clientAddr;
SOCKET client;
HANDLE hThread;
DWORD threadId;
int addrLen;
//加载winsocket动态链接库
int result = WSAStartup(MAKEWORD(2,2), &data);
if(result != NO_ERROR)
{
printf("Load winsocket dll wrong\n");
return 1;
}
//建立服务器端监听socket
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listenSocket == INVALID_SOCKET)
{
printf("Create listen socket failed:%d\n", WSAGetLastError());
WSACleanup();
return 1;
}
//服务器端socket 绑定监听端口和地址
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(HOST_ADDRESS);
serverAddr.sin_port = htons(HOST_PORT);
if(bind(listenSocket,(sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
{
printf("bind error:%s\n",WSAGetLastError());
closesocket(listenSocket);
WSACleanup();
return 1;
}
//监听端口
listen(listenSocket, 10);
//阻塞获取客户socket
while(1)
{
addrLen = sizeof(clientAddr);
client = accept(listenSocket, (struct sockaddr*)&clientAddr, &addrLen);
clients.push_back(client);
printf("num of client is %d\n", clients.size());
if(client == INVALID_SOCKET)
{
printf("create client socket failed:%d\n",WSAGetLastError());
break;
}
object obj;
obj.addr = clientAddr;
obj.sock = client;
//为每个客户建立处理线程
hThread = CreateThread(NULL,0,clientThread,(LPVOID)&obj, 0, &threadId);
if(hThread == NULL)
{
printf("create thread failed:%d\n",WSAGetLastError());
break;
}
}
closesocket(listenSocket);
WSACleanup();
getchar();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
C++用win socket api实现的简单的聊天室程序
共63个文件
pdb:10个
exe:9个
obj:7个
5星 · 超过95%的资源 需积分: 50 417 下载量 75 浏览量
2011-12-08
09:38:11
上传
评论 16
收藏 5.38MB RAR 举报
温馨提示
本程序用winsocket 实现了一个基于c/s 架构的简单的聊天室程序。 采用面向连结的socket api, 信息发送、接收为阻塞同步方式。为实现多用户聊天,采用了服务器端分发线程处理,主线程阻塞接受客户端socket, 每接收一个socket连接就分发一个线程处理,通过全局变量保存所有客户socket 连接,在每个处理线程中通过客户socket 连接池中每个客户连接发送信息实现消息广播通知。
资源推荐
资源详情
资源评论
收起资源包目录
socket.rar (63个子文件)
clientserverV1.0可执行程序
Client.exe 172KB
Server.exe 172KB
源码
ClientServerV1.0
ClientServer.ncb 49KB
ClientServer.dsw 740B
Client
Client.dsp 4KB
Debug
client.obj 15KB
vc60.pdb 76KB
Client.exe 172KB
vc60.idb 145KB
Client.ilk 183KB
Client.pch 3.48MB
server.obj 16KB
Client.pdb 449KB
client.cpp 2KB
Client.plg 246B
ClientServer.opt 53KB
Server
Debug
Server.pch 3.48MB
vc60.pdb 76KB
Server.ilk 191KB
Server.pdb 441KB
vc60.idb 145KB
server.obj 18KB
Server.exe 172KB
Server.dsp 4KB
server.cpp 3KB
Server.plg 1KB
ClientServerV2
try
Debug
vc60.pdb 76KB
try.ilk 187KB
vc60.idb 57KB
try.exe 184KB
try.obj 20KB
try.pch 1.09MB
try.pdb 361KB
try.plg 240B
try.cpp 174B
try.dsp 4KB
ClientServer.ncb 57KB
ClientServer.dsw 927B
Client
Client.dsp 4KB
Debug
client.obj 17KB
vc60.pdb 76KB
Client.exe 172KB
vc60.idb 145KB
Client.ilk 185KB
Client.pch 3.48MB
server.obj 16KB
Client.pdb 449KB
client.cpp 3KB
Client.plg 246B
ClientServer.opt 58KB
Server
Debug
Server.pch 4.42MB
vc60.pdb 108KB
Server.ilk 195KB
Server.pdb 473KB
vc60.idb 177KB
server.obj 38KB
Server.exe 176KB
Server.dsp 4KB
server.cpp 3KB
Server.plg 900B
clientserverV2.0可执行程序
Client.exe 172KB
Server.exe 176KB
程序说明.doc 217KB
共 63 条
- 1
jiangsy1107
- 粉丝: 2
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于SpringBoot的IT技术交流和分享平台(程序+数据库+报告)
- opt_metac.cxx
- 筑建项目相关信息导入系统,可用作对外API接口传输数据
- 麒麟V10-node20.5环境安装包
- 2024云原生开源沙龙之AI应用工程化专场论坛PPT合集.pdf
- 使用 C++ 构建了路径规划器,可自动引导车辆在高速公路上穿行(采用环境预测、行为规划和轨迹生成)+项目源码+文档说明+代码注释
- stage2_weight.pth.tar
- 2-对接定制需求20241010
- 麒麟V10-npm缓存包
- 【Unity幻想部落和野蛮风格资源包】Top-Down Barbarian Camp 快速搭建野蛮人的营地场景
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页