2014-11-08 3 views
0

Я пишу простое приложение C++ над Ubuntu.Неожиданное поведение 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; 
} 

Я выполнил команду через терминал, как:

[email protected]:~/Desktop/LCR$ g++ -Wall -W -Werror main.cpp -o prog 
[email protected]:~/Desktop/LCR$ sudo ./prog 

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

+2

Почему вы смешиваете stdio с 'cout'? – Barmar

+0

Собственно, нет. Я просто пытаюсь решить проблему. –

ответ

5

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

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

или позвоните fflush(stdout) после printf() линии.

+0

Дорогой, он решен, спасибо вам большое. –

+0

Если это сработало для вас, отметьте его как принятый ответ! – Bas

Смежные вопросы