我们正在学习如何使用套接字和线程,并尝试制作一个简单的聊天程序。多个客户端可以成功连接,并且所有客户端都可以接收消息,但只有第一个连接客户端可以发送消息。
所以客户端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;
}
}
}
任何人都可以告诉我们是否采取了正确的方式,或者我们是否做了完全错误的事情?
谢谢!
答案 0 :(得分:0)
今天我的教授找到了解决方案:
results = [ func(i, j) for i, j in df['col1'] & df['col2'] ]
这一行绝对错误,必须是
(*sockArray2)[number].recv();