0

I have a function which acts as a server an another function which acts as a client.I am able to communicate with each other but the data which i want to print as the output(server)is not printed till i close the socket.But the output is shown for he client.

CLIENT CODE

void SubscriberConnection::ReceiveFileFromPublisher()
{
    char buff[1024];
    string check="verified";
    int n;
    //sending key
    bzero(buff,sizeof(buff));
    read(SubToPubSockfd,buff,sizeof(buff));
    cout<<buff<<"\n";

    bzero(buff, sizeof(buff));
    n=0;
    while ((buff[n++] = getchar()) != '\n');

    write(SubToPubSockfd, buff, sizeof(buff));

    //receiving verification
    bzero(buff, sizeof(buff));
    read(SubToPubSockfd, buff, sizeof(buff));
    string reply(buff);
    if (reply.compare(check) == 0)
    {
        cout << "Enter name of file required\n";
        bzero(buff, sizeof(buff));
        n = 0;
        while ((buff[n++] = getchar()) != '\n');
        write(SubToPubSockfd, buff, sizeof(buff));
        cout<<"File request sent \n";
        int ch = 0;

        char buffer[256] = {0};
        FILE *fp;
        fp = fopen(buff, "a");
        int words;
        read(SubToPubSockfd, &words, sizeof(int));
        while (ch != words)
        {
            read(SubToPubSockfd, buffer, 255);
            fprintf(fp, "%s", buffer);
            ch++;
        }
        printf("The file was received successfully\n\n");
    }

SERVER CODE

    void PublisherConnection::listenForSubscriber()
    {

        ALSSockFd = socket(AF_INET, SOCK_STREAM, 0);
        if (ALSSockFd < 0)
            error("ERROR opening socket");
        else
            printf("Socket successfully created..\n");
        bzero((char *)&ALSServAddr, sizeof(ALSServAddr));
        ALSServAddr.sin_family = AF_INET;
        ALSServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        ALSServAddr.sin_port = htons(PORT_PUB_SUB);
        if (bind(ALSSockFd, (struct sockaddr *)&ALSServAddr, sizeof(ALSServAddr)) < 0)
        {
            error("ERROR on binding");
        }
        else
            printf("Socket successfully binded..\n");
        if ((listen(ALSSockFd, 5)) != 0)
        {
            printf("Listen failed...\n");
            exit(0);
        }
        else
            printf("Publisher listening..\n");
        SubLen = sizeof(Sub_Addr);
        ALSNewSockFd = accept(ALSSockFd, (struct sockaddr *)&Sub_Addr, &SubLen);
        if (ALSNewSockFd < 0)
        {
            error("ERROR on accept");
        }
        else
            cout << "Connected to Subscriber";
        askForFile();
    }


void PublisherConnection::askForFile()
{
    string key = "123456\n";
    char buff[1024];
    int n, i;

    //asks to enter key
    string message="Please enter the key";
    write(ALSNewSockFd,message.c_str(),sizeof(message));
    cout<<"Asked For key";

    //receives key;
    bzero(buff, sizeof(buff));
    read(ALSNewSockFd, buff, sizeof(buff));
    string inputKey(buff);
    if (key.compare(inputKey) == 0)
    {
        string message = "verified";
        write(ALSNewSockFd, message.c_str(), sizeof(buff));

        //receving file name
        bzero(buff, sizeof(buff));
        read(ALSNewSockFd, buff, sizeof(buff));
        cout << "\nPublisher asked for:" << buff;
        sendFileToSub(buff);
        //printf("From Subscriber : %s", buff);
        //}
    }
    else{
        string message = "Wrong key";
        write(ALSNewSockFd, message.c_str(), sizeof(buff));
        askForFile();
    }
}

After the connection takes place, any data sent from server is being received and printed but on the server the data is being sent but any following cout statements are not being printed

Edit: The sockets are global variables so we can reuse them.

Harshvardhan
  • 13
  • 1
  • 4

0 Answers0