c++ socket 多线程 网络聊天室
文章目录
- 1. 实现图解
- 2. 聊天室服务端:TCP_Server_Chat.cpp
- 3. 聊天室客户端:TCP_Client_Chat.cpp
1. 实现图解
2. 聊天室服务端:TCP_Server_Chat.cpp
#include <winsock2.h> // winsock2的头文件
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;// stdcall的线程处理函数
DWORD WINAPI ThreadFun(LPVOID lpThreadParameter);int main()
{WSADATA wd;if(WSAStartup(MAKEWORD(2,2), &wd) != 0){cout << "WSAStartup Error:" << WSAGetLastError() << endl;return 0;}// 1. 创建流式套接字SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){cout << "socket error:" << WSAGetLastError() << endl;return 0;}// 2. 绑定端口和ipsockaddr_in addr;memset(&addr, 0, sizeof(sockaddr_in));addr.sin_family = AF_INET;addr.sin_port = htons(8000);addr.sin_addr.s_addr = inet_addr("127.0.0.1");int len = sizeof(sockaddr_in);if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){cout << "bind Error:" << WSAGetLastError() << endl;return 0;}// 3. 监听listen(s,5);// 主线程循环接收客户端的连接while(true){sockaddr_in addrClient;len = sizeof(sockaddr_in);// 4.接受成功返回与client通讯的SocketSOCKET c = accept(s, (SOCKADDR*)&addrClient, &len);if(c != INVALID_SOCKET){// 创建线程,并且传入与client通讯的套接字HANDLE hThread = CreateThread(NULL, 0, ThreadFun, (LPVOID)c, 0, NULL);CloseHandle(hThread); // 关闭对线程的引用}}// 6.关闭监听套接字closesocket(s);// 清理winsock2的环境WSACleanup();return 0;
}DWORD WINAPI ThreadFun(LPVOID lpThreadParameter)
{// 5.与客户端通讯,发送或者接受数据SOCKET c= (SOCKET)lpThreadParameter;cout << "欢迎" << c << "进入聊天室!" << endl;// 发送数据char buf[100] = {0};sprintf(buf,"欢迎 %d 进入聊天室!",c);send(c,buf, 100, 0);// 循环接收客户端数据int ret=0;do {char buf2[100] = {0};ret = recv(c, buf2, 100, 0);cout << c << " 说:" << buf2 << endl;} while (ret!=SOCKET_ERROR && ret!=0);cout << c << "离开了聊天室!";return 0;
}
启动聊天室服务端:
3. 聊天室客户端:TCP_Client_Chat.cpp
#include<winsock2.h>//winsock2的头文件
#include<iostream>
using namespace std;//勿忘,链接dll的lib
#pragma comment(lib, "ws2_32.lib")int main()
{//加载winsock2的环境WSADATA wd;if (WSAStartup(MAKEWORD(2, 2), &wd) != 0){cout << "WSAStartup error:" << GetLastError() << endl;return 0;}//1.创建流式套接字SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (s == INVALID_SOCKET){cout << "socket error:" << GetLastError() << endl;return 0;}//2.链接服务器sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8000);addr.sin_addr.s_addr = inet_addr("127.0.0.1");int len = sizeof(sockaddr_in);if (connect(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR){cout << "connect error:" << GetLastError() << endl;return 0;}//3接收服务端的消息char buf[100] = { 0 };recv(s, buf, 100, 0);cout << buf << endl;//3随时给服务端发消息int ret = 0;do{char buf[100] = {0};cout << "请输入聊天内容:";cin >> buf; ret = send(s, buf, 100, 0); } while (ret != SOCKET_ERROR&& ret != 0);//4.关闭监听套接字closesocket(s);//清理winsock2的环境WSACleanup();return 0;
}
启动2个客户端
c++ socket 多线程 网络聊天室相关推荐
- 基于Java socket的网络聊天室的设计与实现
目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...
- Linux C/TCP多线程网络聊天室
多线程TCP网络聊天室 我们都知道TCP是一种基于连接的传输协议,使用多线程来实现其实步骤很简单. 首先说明一下项目:服务端开启后,直接运行客户端可以加入聊天室,同时其他客户端可以接收到某某客户端进入 ...
- linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...
陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...
- 基于Socket通信的在线网络聊天室
文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...
- 使用socket实现基于select模型的网络聊天室
假期闲来无事,便写了个小小的网络聊天室程序.以前一直都是写MFC的有界面的程序,时间长了,便失去了兴趣,感觉有些东西经过MFC的封装,反而失去了意义,让人学不到东西,所以,丢开MFC那层的东西,直接使 ...
- 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器
早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...
- C语言实现网络聊天室 socket的简单应用
C语言实现网络聊天室 socket的简单应用 前言:环境是Linux ,使用了 socket和pthread,主要分为服务器端和客户端两部分,服务器端监听端口发来的请求,收到后向客户端发送一个消息,客 ...
- python socket + tkinter实现网络聊天室
个人博客文章链接:http://www.huqj.top/article?id=169 最近突然想用socket做个聊天室程序,之前用java写过一个文件传输的程序,这次就用python做一下,顺便也 ...
- python socket 网络聊天室_Python基于Socket实现简单聊天室
本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...
最新文章
- matlab拟合曲线后求导,高手留步:MATLAB五阶拟合函数,求导后离散化,输出结果是星号...
- C、C++中的转义符
- javascript基础 (2)
- Scala \和%运算小案例
- python与用户交互、数据类型
- 如何用python做一个会聊天的女朋友_520来啦~教你用Python给自己造了一个女朋友!...
- 【模拟】Codeforces 711A Bus to Udayland
- 2013年总结(4)-人脉
- Github copilot: AI协助编程尝试
- python时间模块小结
- element-ui的分页,添加首页、尾页,跳转按钮
- apache beam java api_Apache Beam的基本概念
- ios系统软件迁移到安卓_苹果一键换机到安卓(苹果安卓一键迁移的软件)
- 小米重大变革:成立十个一级部门大量启用80后 向雷军汇报
- 关于一个大学生如何利用编程赚钱
- 人工智能培训市场前景如何?
- python爬虫-世界今日疫情爬虫
- [华为机试真题]69.姓名的夫妻相
- 爬取链家二手挂单房屋 - 匹配百度地图API坐标 - python出地图【2】(end) echarts调用百度地图画自己喜欢的底图,最终python出地图
- 使用layui时报错l.push is not a function
热门文章
- 浅谈const int *,int const *与int *const
- h5清理微信浏览器网页缓存
- model.named_parameters()与model.parameters()
- Linux语言和字体的自定义设置
- EMD——EEMD——CEEMD
- 如何在云服务器粘贴文件,云服务器粘贴文件
- android 反编译解析.
- Excel插入XactiveX提示出错“不能插入对象”解决
- 学号20189220余超 2018-2019-2 《密码与安全新技术专题》第七周作业
- 动态规划——什么是动态规划?