Я хочу создать простое клиентское приложение чата на C ++, используя системный вызов select (). Однако, когда я подключаюсь через te lnet к указанному серверу c, он не дает мне никакого вывода. Он работает нормально до приветственной части, однако после этого, когда я набираю сообщение, оно не отправляет его другим клиентам. пожалуйста, помогите.
Я поместил свой полный код сервера ниже.
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <string>
#include <sys/times.h>
#include <sys/select.h>
#include <vector>
using namespace std;
int main()
{
// Create a socket
int listening = socket(AF_INET, SOCK_STREAM, 0);
if (listening == -1)
{
cerr << "Can't create a socket! Quitting" << endl;
return -1;
}
sockaddr_in serv;
serv.sin_family=AF_INET;
serv.sin_port=htons(54000);
inet_pton(AF_INET, "0.0.0.0", &serv.sin_addr);
//binding
if(( bind(listening, (sockaddr*)&serv, sizeof(serv)))<0){
perror("bind failed");
exit(1);
}
//listen
if((listen(listening,5))<0){
perror("listen failed");
exit(1);
}
fd_set master;
FD_ZERO(&master);
socklen_t s=sizeof(serv);
//adding the first socket to the set
FD_SET(listening,&master);
vector <int> clientSocket;
clientSocket.push_back(listening);
while(true){
//fd set is destructive so create a copy of the master
fd_set copy=master;
int max_sd=listening;
//create a cnt var
int socketCount=select(max_sd+1,©,nullptr,nullptr,nullptr);
for(int i=0;i<socketCount;i++){
int sock = FD_ISSET(clientSocket[i],©);
if(sock==listening){
//if new client add it to the set
int client=accept(listening,(struct sockaddr*)&serv,(socklen_t*)&s);
if(accept<0)
perror("accept failed");
FD_SET(client,&master);
clientSocket.push_back(client);
//send welcome messg
string messg="Welcome to the Chat";
send(client,messg.c_str(),messg.size()+1,0);
}
else{
//read the message received
char buff[4096];
bzero(buff,4096);
int read=recv(sock,buff,4096,0);
if(read<=0){
//drop the client
close(sock);
FD_CLR(sock,&master);
}
else{
for(int i=0;i<clientSocket.size();i++){
int outSock=FD_ISSET(clientSocket[i],&master);
if(outSock!=listening && outSock!=sock){
send(outSock,buff,read,0);
}
}
}
}
}
}
}