Linux下c++11多线程聊天室
刚看的c++11多线程,写个聊天室试试
编译的时候加上 c++11 和 多线程库
g++ -Wall -std=c++0x -pthread -o server server.cpp
server 和client 都是 q 退出
1. [代码]server.cpp
#include <iostream>
#include <thread>
#include <arpa/inet.h>
#include <cstring>
#include <vector>
#include <algorithm>
#include <unistd.h>
using namespace std;
vector<int> cli_vec;
int listenfd, port;
const char *ip = "127.0.0.1";
void SendMsg(char* buf, int connfd){
//cout<<"now send..."<<endl;
char *data = buf;
int len;
for(auto i=cli_vec.begin(); i!=cli_vec.end(); ++i){
if(*i == connfd) continue;
if((len=send(*i, data, strlen(data),0)) == -1){
//cout<<"send error"<<endl;
}else{
//cout<<"Send: "<<data<<endl;
}
}
}
void RecvMsg(int connfd){
int len;
char buf[100];
while(1){
memset(buf, 0, sizeof(buf));
//cout<<"now receive..."<<connfd<<endl;
if((len = recv(connfd, buf,sizeof(buf), 0)) == -1){
//cout<<"Falid to receive"<<endl;
}
if(0 == len){
cout<<connfd<<" has exit the chatting room"<<endl;
auto pos = find(cli_vec.begin(), cli_vec.end(), connfd);
if(pos != cli_vec.end()){
cli_vec.erase(pos);
}
break;
}
SendMsg(buf,connfd);
}
}
void WaitQuit(){
char buf[100];
while(1){
cin>>buf;
if(0 == strcmp(buf,"q")){
for(auto i=cli_vec.begin(); i!=cli_vec.end(); i++){
close(*i);
}
cli_vec.clear();
close(listenfd);
break;
}
}
exit(0);
}
int main()
{
if((listenfd=socket(AF_INET,SOCK_STREAM,0)) == -1){
cout<<"socket error"<<endl;
return -1;
}
cout<<"请输入端口号:";
cin>>port;
struct sockaddr_in serv_addr,cli_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
serv_addr.sin_addr.s_addr = inet_addr(ip);
if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){
cout<<"bind error"<<endl;
return -1;
}http://www.enterdesk.com/special/dushen/
if(listen(listenfd, 10) == -1){
cout<<"listen error"<<endl;
return -1;赌神
}
std::thread(WaitQuit).detach();
cout<<"server is running..."<<endl;
while(1){
size_t cli_len = sizeof(cli_addr);
memset(&cli_addr, 0, cli_len);
int connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &cli_len);
if(connfd == -1){
cout<<"accept error"<<endl;
return -1;
}
cout<<connfd<<" has enter the chatting room"<<endl;
cli_vec.push_back(connfd);
std::thread(RecvMsg, connfd).detach();
}
return 0;
}
2. [代码]client.cpp
#include <iostream>
#include <arpa/inet.h> // socket 相关 ...
#include <unistd.h> // close()
#include <thread>
#include <string>
#include <cstring>
using namespace std;
int sockfd;
struct sockaddr_in serv_addr;
void SendMsg(const string &msg) {
if(-1 == send(sockfd, msg.c_str(), msg.size(), 0))
cout<<"Failed to send"<<endl;
}
void RMsg(){
int len;
char recv_buf[1024];
while (1) {
memset(recv_buf, 0, sizeof(recv_buf));
len = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
if (-1 == len) {
cout<<"Failed to recv"<<endl;
}
if(0 == len){
close(sockfd);
cout<<"与服务器断开链接!"<<endl;
break;
}
cout<<"Receive message: "<<recv_buf<<endl;
}
}
int main()
{
string ip = "127.0.0.1";
int port;
cout<<"please input server port:";
cin>>port;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd) {
cout<<"Failed to sockfd"<<endl;
return -1;
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(port);
serv_addr.sin_addr.s_addr = inet_addr(ip.c_str());
int stat = connect(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr));
if (-1 == stat) {
cout<<"Failed to connect"<<endl;
return -1;
}
std::thread(RMsg).detach();
while(1)
{
string send_msg;
cin>>send_msg;
if (send_msg == "q")
{
cout<<"结束客户端!"<<endl;
break;
}
else
SendMsg(send_msg);
}
close(sockfd);
return 0;
}
Linux下c++11多线程聊天室的更多相关文章
- Linux以下基于TCP多线程聊天室(client)
不怎么会弄这个博客的排版,就直接将代码附上: 主要是使用多线程去等待接受数据和发送数据.以下是client的代码: tcpsed.h文件 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- Linux以下基于TCP多线程聊天室(server)
接上篇博文,本文是server端的实现,主要实现的功能,就是现实client的连接.转发client发送的消息.以及client掉线提示等功能,同一时候能够在这这上面扩展和TCP以及线程相关的功能木块 ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- 【C++】基于socket的多线程聊天室(控制台版)
以前学习socket网络编程和多线程编程的时候写的一个练手程序 聊天室基本功能: 1.用户管理:登录,注册,登出,修改用户名,修改密码 2.聊天室功能:群聊,私聊,获取在线用户列表,获取所有用户列表 ...
- TCP多线程聊天室
TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...
- linux下C++的多线程编程
1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...
- linux 下 多进程与多线程
[Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...
- 使用Html5下WebSocket搭建简易聊天室
一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...
- Linux下c语言TCP多线程聊天室
开发环境:Linux,GCC 相关知识:TCP(博客:传送门),线程 附加:项目可能还有写不足之处,有些bug没调出来(如:对在线人数的控制),希望大佬赐教. 那么话不多说,放码过来: 码云:传送门, ...
随机推荐
- css3 jQuery实现3d搜索框+为空推断
<!DOCTYPE html> <html> <head> <title>css3实现3d搜索框</title> <style> ...
- Linux下SVN安装与权限管理
cat /etc/redhat-release //查看系统版本号 CentOS release 7.1 (Final) 这里我们採用yum源安装方式: 1.安装svn yum install sub ...
- 杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse' Trade》《今年暑假不AC》《排名》《开门人和关门人》
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2Fpc2luaV92Yw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- lua面向对象铺垫
Account = { balance = , withdraw = function(self, v) self.balance = self.balance - v end } --:操作符隐藏了 ...
- 软件测试人员需要精通的开发语言(2)--- SQL
简单的入门语言vbs,通过实例的练习以及简单的应用,基本可以掌握vbs脚本的使用.如果说vbs只是为了实际测试中开发脚本,便捷测试的目的.那SQL语言就是测试人员的必备技能了,任何系统都会用到数据库, ...
- 3.设计模式----TemplateMethod模式
模板模式,其实是一种思想,在开发中有很多地方用到模板,因为毕竟我们不可能每一个都一出一段!一个模板,填充不同,出来效果也是不一样! 准备画个时序图的,没找到工具,过几天补上! 模板模式在出现bug时候 ...
- php字符串操作: 去掉UTF-16的空格
$s = json_encode($s); $s = str_replace('\u00a0','',$s); $s = str_replace('\u3000','',$s); $s = str_r ...
- 【Android】开发优化之——调优工具:dump hprof file 查看内存情况,找到内存泄露
虽说知道一般性的开发android应用须要注意的问题,但是也有水平參差不齐的情况.特别是维护代码,假设内存占用大,内存溢出严重,又怎么解决呢? -- 通过DDMS把heap抓出来分析 1.打开DD ...
- linux c编程:Posix共享内存区
Posix共享内存区:共享内存是最快的可用IPC形式.它允许多个不相关(无亲缘关系)的进程去访问同一部分逻辑内存.如果需要在两个进程之间传输数据,共享内存将是一种效率极高的解决方案.一旦这样的内存区映 ...
- ABAP 内表
定义内表 1. 先声明表结构, 再根据表结构定义内表. TYPES: BEGIN OF w_itab, a(10), b(10), END OF w_itab. DATA: itab1 type ...