Я пишу простое приложение 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
на экране, тогда как ничего не появляется. Заранее благодарим за любую помощь, С уважением
По умолчанию вывод stdout на терминал буферизируется по строке, поэтому вывод не будет напечатан до новой строки. Изменить на:
printf("Just a test line\n");
или вызвать fflush(stdout)
после строки printf()
.
cout
?