刚看的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. Sql效能优化总结(续)- sql语句优化篇

    今晚继续进行Sql效能问题的分享,今天主要是一些具体的sql优化方法和思路分享,若看过后你也有其他想法,欢迎一起探讨,好了,进入今天的主题. 针对性地对一些耗资源严重的具体应用进行优化 出现效能问题时 ...

  2. vmware workstation(mac版)查看vmnet8的网关地址

    想为虚拟机配置固定ip,需要设置网关,但是mac版的vmware workstation没有Virtual Network Editor,所以不能直接查看到. 因此执行如下命令进行查找 find / ...

  3. MIC中函数和变量的声明

    c++/c使用 __declspec(target(mic))函数或变量声明 或 __attribute__((target(mic)))函数或变量声明 举例如下: __attribute__((ta ...

  4. atom常用插件安装

    安装插件方法: File -Settings -Install 在搜索框里搜索你想要的插件,出来之后 点击install ,下图以 linter-selint 为例 ATOM常用插件推荐 simpli ...

  5. 使用Socket通信实现FTP客户端程序

    FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...

  6. struts2一个实例中遇到的问题

    今天实现了一个登录功能的Struts2小程序. 期间遇到了许多问题,记忆犹新的是 (1)新版本的tomcat9和eclipse Neon Release (4.6.0) 发生了冲突,启动服务器的时候老 ...

  7. java servlet中上传文件的简单实现(基于第三方jar)

    这里的案例使用了两种文件上传的组件.分别介绍 1.使用JSPSmartUpload完成上传 package test_servlet_package; import java.io.File; imp ...

  8. python 列表中字符串排序故事一则

    a = ["bca","cab","abc"] 有时候需要对列表排序 如果是对列表中整个元素 直接用sort()排序 如果想按元素的某一段排 ...

  9. Js版json解析

    JsonDecoder={ pos:0, isDigit:function(ch){ return ( ch >= '0' && ch <= '9' )||( ch == ...

  10. PHP的依赖管理工具----composer

    安装Composer 参考:https://getcomposer.org/doc/01-basic-usage.md composer 是PHP依赖管理工具 PHP最低版本要求5.3.2,需要允许o ...