首页 > 解决方案 > 即使在与客户端连接后,服务器代码也不显示输出

问题描述

我有一个充当服务器的功能,另一个充当客户端的功能。我能够相互通信,但是我想作为输出(服务器)打印的数据在我关闭套接字之前不会打印。但是输出显示给他的客户。

客户代码

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");
    }

服务器代码

    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();
    }
}

连接发生后,正在接收并打印从服务器发送的任何数据,但在服务器上正在发送数据,但未打印任何后续 cout 语句

编辑:套接字是全局变量,因此我们可以重用它们。

标签: c++sockets

解决方案


推荐阅读