Неожиданное поведение C ++ над Ubuntu

0

Я пишу простое приложение C++ по Ubuntu.

int main()
{
    printf("Just a test line"); 
    Server();
    cout << "2"; 
return 1;
}

Несмотря на то, что является серверной функцией, приложение начинает ее выполнять, прежде чем писать что-либо на консоли (т.е. Just a test line)


Моя подробная проблема:


Пожалуйста, приложите все приложение, где server() отвечает за прослушивание соединений на порту 4444.

#include <stdio.h>
#include <sys/types.h>
#include <cstdlib>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <strings.h>
#include <cstring>
#include <pthread.h>
#include <algorithm>
#include <iostream>
#include "message.h"
using namespace std;

#define iPort 4444

void Server(){
    cout << "3"; 
    int sockfd, newsockfd, n;
    socklen_t clilen;
    message m; // predefined class
    char *buffer = (char *) malloc (sizeof (m));
    struct sockaddr_in serv_addr, cli_addr;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
        cerr << "ERROR opening socket";
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(iPort);
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
        cerr << "ERROR on binding"<< endl;
    listen(sockfd,5);
    clilen = sizeof(cli_addr);
    int pid =0;
    while (1)
    {
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0)
            cerr << "ERROR on accept" << endl;
        pid = fork();
        if (pid < 0)
            cerr << "ERROR on fork"<< endl;
        if (pid == 0)
        {
            close(sockfd);
            bzero(buffer,sizeof(m));
            buffer= (char*)&m;
            n = read(newsockfd,buffer,sizeof(m));
            if (n < 0) cerr << "ERROR reading from socket"<< endl;
            exit(0);
        }
        else close(newsockfd);
    }
}

int main()
{
    printf("Just a test line"); 
    Server();
    cout << "2"; 
return 1;
}

Я выполнил команду через терминал следующим образом:

pc@pc-SM40P:~/Desktop/LCR$ g++ -Wall -W -Werror main.cpp -o prog
pc@pc-SM40P:~/Desktop/LCR$ sudo ./prog

Я ожидал получить Just a test line на экране, тогда как ничего не появляется. Заранее благодарим за любую помощь, С уважением

  • 2
    Почему ты смешиваешь stdio с cout ?
  • 0
    Вообще-то, нет. Я просто пытаюсь решить проблему.
Теги:
sockets

1 ответ

5
Лучший ответ

По умолчанию вывод stdout на терминал буферизируется по строке, поэтому вывод не будет напечатан до новой строки. Изменить на:

printf("Just a test line\n"); 

или вызвать fflush(stdout) после строки printf().

  • 0
    Уважаемый, это решено, большое спасибо.
  • 0
    Если это сработало для вас, отметьте это как принятый ответ!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню