Linux上带有套接字和多个客户端的C ++线程请求每次请求聊天

时间:2018-03-20 12:41:00

标签: c++ sockets pthreads

我们正在学习如何使用套接字和线程,并尝试制作一个简单的聊天程序。多个客户端可以成功连接,并且所有客户端都可以接收消息,但只有第一个连接客户端可以发送消息。

所以客户端nr 1完全正常工作,其他所有客户端只能接收但不能发送到服务器。

所有线程都像我们认为的那样运行,但只有第一个接收线程能够从接收队列中读取。

使用netstat,我们可以看到第二个客户端的消息队列已满 screenshot from netstat

#include <iostream>
#include "socket.hpp"
#include <string>
#include <queue>
#include <unistd.h>

using namespace std;

int clients[100];//All Clientnumbers
int i=0;//Number of connected Clients
Socket* sockArray[100];
Socket* sockArray2[100];
queue<string> nachrichten;//message queue

void *empfangen(void* x);
void *tpr(void* servsockp);

int main()
{

    cout << "Hello, World! Server startet" << endl;

    ServerSocket servSock(6200, 1000);//start Serversocket
    ServerSocket *servsockp = &servSock;

    pthread_t tpr_starter;//new thread that creates tpr
    pthread_create(&tpr_starter, NULL, tpr,(void*)servsockp);

   while(true)      //if there are messages in the queue send them to all clients
    {
        if(nachrichten.size()!=0)
        {
            for (int y = 0; y < i; y++)
            {
                try
                {
                    cout<< "Gesendet: " << nachrichten.front() <<clients[0]<<clients[1]<<i<< endl;
                    (*sockArray[y]).send(nachrichten.front());

                } catch (SocketException e) {
                    cout << e.getError() << endl;
                }
            }
            nachrichten.pop();
        }
    }
    pthread_join(tpr_starter, NULL);
}

void*tpr(void* servsockp)//open socket for every request, start new receiving thread
{
    while(true)
    {
        clients[i]= (*(ServerSocket*)(servsockp)).accept();
        int*x =new int(i);

        Socket *sock = new Socket(clients[i]);
        sockArray[i]=sock;
        sockArray2[i]=sock;
        i++;
        sleep(2);

        pthread_t rec;
        pthread_create (&rec, NULL, empfangen, (void*)x);
    }
}

void *empfangen(void* x)//listening on new socket, put received messages in queue
{
    int number=*(int*)x;
    cout <<"Receiving/thread started on Socket Nr: "<< number<<endl;
    while(true){
        try {
            string nachricht = (*sockArray2)[number].recv();
            if(nachricht=="")
            {
                break;
            }
            cout <<"Received: "<< nachricht << endl;
            nachrichten.push(nachricht);
        }catch(SocketException e){
            cout << e.getError()<<endl;
        }
    }
}

任何人都可以告诉我们是否采取了正确的方式,或者我们是否做了完全错误的事情?

谢谢!

1 个答案:

答案 0 :(得分:0)

今天我的教授找到了解决方案:

results = [ func(i, j) for i, j in df['col1'] & df['col2'] ]

这一行绝对错误,必须是

(*sockArray2)[number].recv();