Создал простое клиентское приложение чата с использованием Socket на C ++ - PullRequest
0 голосов
/ 13 июля 2020

Я хочу создать простое клиентское приложение чата на 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,&copy,nullptr,nullptr,nullptr);

        for(int i=0;i<socketCount;i++){
                int sock = FD_ISSET(clientSocket[i],&copy);
                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);
                                        }
                            }

                        }

                }
        }


    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...