刚看的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多线程聊天室的更多相关文章

  1. Linux以下基于TCP多线程聊天室(client)

    不怎么会弄这个博客的排版,就直接将代码附上: 主要是使用多线程去等待接受数据和发送数据.以下是client的代码: tcpsed.h文件 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  2. Linux以下基于TCP多线程聊天室(server)

    接上篇博文,本文是server端的实现,主要实现的功能,就是现实client的连接.转发client发送的消息.以及client掉线提示等功能,同一时候能够在这这上面扩展和TCP以及线程相关的功能木块 ...

  3. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  4. 【C++】基于socket的多线程聊天室(控制台版)

    以前学习socket网络编程和多线程编程的时候写的一个练手程序 聊天室基本功能: 1.用户管理:登录,注册,登出,修改用户名,修改密码 2.聊天室功能:群聊,私聊,获取在线用户列表,获取所有用户列表 ...

  5. TCP多线程聊天室

    TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...

  6. linux下C++的多线程编程

    1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...

  7. linux 下 多进程与多线程

    [Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...

  8. 使用Html5下WebSocket搭建简易聊天室

    一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ...

  9. Linux下c语言TCP多线程聊天室

    开发环境:Linux,GCC 相关知识:TCP(博客:传送门),线程 附加:项目可能还有写不足之处,有些bug没调出来(如:对在线人数的控制),希望大佬赐教. 那么话不多说,放码过来: 码云:传送门, ...

随机推荐

  1. ubuntu16.04上安装深度学习基本框架caffe2 pytorch tensorflow opencv

    anaconda3.5.2.0----python3.6: conda  install   tensorflow-gpu  -y --prefix  /media/wkr/diskHgst/ubun ...

  2. spark-submit 提交任务

    将工程打成jar 放入到linux中 切换到[root@node4 Desktop]# cd /usr/local/development/spark-2.0-hadoop2.6/bin/ 输入命令 ...

  3. android:分享 一个非常强大的LOG开关---Log.isLoggable

    1.API亮点: 此API能够实现不更换APK.在出问题的手机上就直接能抓到有效log,能提升不少工作效率. .API介绍 近期在解决短信问题时.看到一个非常强大的LOG开关---Log.isLogg ...

  4. centos6.9使用NTFS-3G挂载ntfs文件系统

    centos6.9使用NTFS-3G挂载ntfs文件系统 工作中,难免需要到linux 系统上拷贝文件,但linux 自己不支持ntfs,下面就是解决问题的办法. NTFS-3G是一个开源软件,支持在 ...

  5. Maven项目Update Project...后JRE System Library会自动变回1.5解决办法

    <build> <finalName>pay</finalName> <plugins> <plugin> <groupId>o ...

  6. Java -- 数字

    @.运用BigDecimal处理Double类型的算术运算的精度问题 原文:https://blog.csdn.net/j754379117/article/details/52238396 可使用 ...

  7. iOS 10 中引入了 Message 框架

    WWDC 2016 上最重磅的消息之一就是在 iOS 10 中引入了 Message 框架.开发者现在可以为苹果内置的 Messages 应用开发扩展啦.通过开发一个应用扩展,你可以让用户跟应用在 M ...

  8. CSS3 - 鼠标移入移出时改变样式

    1,使用伪类实现样式切换伪类是CSS2.1时出现的新特性,让许多原本需要JavaScript才能做出来的效果使用CSS就能实现.比如实现下面的鼠标悬停效果,只要为:hover伪类应用一组新样式即可.当 ...

  9. Mysql字符串截取函数

    今天建视图时,用到了MySQL中的字符串截取,很是方便. 感觉上MySQL的字符串函数截取字符,比用程序截取(如PHP或JAVA)来得强大,所以在这里做一个记录,希望对大家有用. 函数: 1.从左开始 ...

  10. Myeclipse 选中高亮

    打开显示功能 选择Windows->Preferences->Java-> Editor-> Mark Occurrences ,勾选选项.这时,当你单击一个元素的时候,代码中 ...