これは少し変わったものです。私のコードは、思ったとおりに出力していませんでした。さまざまな段階でいくつかの印刷ステートメントを追加して、どこで問題が発生しているかを確認しました。まだ何もない。そのため、mainの最初にprintfステートメントを追加しました。ここで私は本当に混乱しました。
したがって、ファイル記述子で何かおかしいことが起こっていると思いました。 printf
をfprintf
に変更しました。まだ何もない。 fprintf
を使用したstderrへの印刷は機能します!なんでこんなことが起こっているの?
最初のprintステートメントとreturnを除くすべての本文をメインから削除すると、印刷されます。
int main(void) {
fprintf(stdout, "STARTED!");
//Create an Internet domain socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
//If this fails exit and print the error
if (sockfd == -1) {
printf("Error %d, cannot create socket", errno);
return 1;
}
printf("SOCKET CREATED!");
//Creates a socket address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
//Attempts to bind to the socket address, again prints to error if this fails.
if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
{
printf("Error %d, cannot bind", errno);
return 1;
}
//Starts Listening for a client
if (listen(sockfd, 1) == -1)
{
printf("Error %d, cannot listen", errno);
return 1;
}
//If all is successful, server is operational
while(1)
{
//Creates a file descripter for the connection
int connfd;
//And a socket address for the client
struct sockaddr_in cliaddr;
socklen_t cliaddrlen = sizeof(cliaddr);
//If a connection attempt is made accepts it.
connfd = accept(sockfd, (struct sockaddr *) &cliaddr, &cliaddrlen);
if (connfd == -1) {
//If the connection fails print an error
printf("Error %d, cannot accept connection", errno);
continue;
}
//Otherwise process the request
else {
printf("CONNECTED!");
char end;
end = 1;
while (end)
{
process_request(connfd);
end = 0;
}
}
close(connfd);
}
close(sockfd);
return 0;
}
多くの場合、出力はシステムによってバッファリングされます。 fflushを呼び出すこともできますが、キャッシングの仕組みによっては、出力を改行で終了するだけで十分な場合もあります。だから変更してみてください
fprintf(stdout, "STARTED!");
に
fprintf(stdout, "STARTED!\n");
それでも問題が解決しない場合は、
fprintf(stdout, "STARTED!\n");
fflush(stdout)
(そして、エラーをすぐに見たいので、stderrはしばしばキャッシュされません。)
最後に、プログラムが終了すると出力が表示され(その後、フラッシュされます)、おそらく残りの動作が説明されます。