C++ 套接字、多线程和输出处理

标签 c++ multithreading sockets output cout

我想制作聊天系统。它应该写你:然后你输入的任何内容,每当你从其他用户那里收到文本时,只需删除你:输入用户:消息和你:再次。

服务器:

        std::cin.ignore();
        std::thread t1(readData,&acceptedSocket);
        do{
            memset(buffer,0,sizeof(buffer));
            std::cout << "You: ";
            std::cin.getline(buffer,255);
            n = send(acceptedSocket,buffer,strlen(buffer),0);
        }while(n > 0);

客户:

    std::cin.ignore();
    std::thread t1(readData,&connectingSocket);
    do{
        memset(buffer,0,sizeof(buffer));
        std::cout << "You: ";
        std::cin.getline(buffer,255);
        n = send(connectingSocket,buffer,strlen(buffer),0);
    }while(n > 0);

读取数据:

void readData(int *socketPointer){
    int connectingSocket = *socketPointer;
    char buffer[256];
    memset(buffer,0,sizeof(buffer));
    while(recv(connectingSocket,buffer,255,0)){
        std::cout << "\b\b\b\b\bUSER:" << buffer << std::endl << "You: ";
        memset(buffer,0,sizeof(buffer));
    }
}

输出:

服务器:

USER:Hello
USER:How are u doing
Hi
You: You: I am fine
USER:gg
wp
You: You:

客户:

You: Hello
You: How are u doing
USER:Hi
USER:I am fine
gg
You: USER:wp

Wannable 服务器输出:

USER:Hello
USER:How are u doing
You: Hi
You: I am fine
USER:gg
You: wp
You: 

Wannable 客户端输出:

You: Hello
You: How are u doing
USER:Hi
USER:I am fine
You: gg
USER:wp
You:

在其他线程中有cin获取换行时,似乎不能输入换行符。谢谢!

最佳答案

我找到答案了! 我注意到当两个线程正在运行时——一个从 cin 流中获取行,另一个正在输出文本,你需要刷新 cout 缓冲区,所以只有文本只出现在 std::endl 之后,它刷新缓冲区并放入新的同时行所以:

std::cout.flush():

解决问题:

    std::cout << "\b\b\b\b\bUSER:" << buffer << std::endl << "You: ";
    std::cout.flush();

关于C++ 套接字、多线程和输出处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306562/

相关文章:

c++ - 关于 volatile 使用的规则是否严格?

java - NodeJS 连接到 Java Mongo 驱动程序

sockets - 使用 ServerSocket 绑定(bind)已使用的端口时,Java 7 不会抛出 BindException

c++ - 具有复杂条目的 ODE

c++ - 在控制台中突出显示文本会使窗口无响应

c++ - 如何通过调用另一个方法从一个对象的方法启动线程?

multithreading - 多线程make

Java NIO - 在服务器端取消注册客户端连接

java - 使用 SWIG 包装第 3 方类/数据类型

c++ - 在任何操作系统上,C/C++ 中的 int main() 返回 0 是否会清除程序在任何(RAM、高速缓存或任何...)内存中使用的所有资源?