c语言 - 服务器端 printf() 不会在没有"n"的情况下打印(TCP 客户端-服务器使用套接字)



练习C网络编程:我正在编写一个简单的TCP客户端-服务器应用程序,该应用程序应该将菜单(在每个客户端的单独线程中)作为字符串从服务器发送到客户端,并在客户端打印菜单(后者将成为控制台商店应用程序)。然后,客户端应该发送一个int(从菜单中选择的选项),服务器应该收到它,但服务器甚至不会打印错误。服务器端:

// Returning message to client
if ( write (tdL.cl, &size_firstLoginMenu, sizeof(int)) <= 0 ) {
printf("[Thread %d] ",tdL.idThread);
perror ("[Thread] Error at write(): size_firstLoginMenu to client.n");
}
if (write (tdL.cl, firstLoginMenu, size_firstLoginMenu) <= 0) {
printf("[Thread %d] ",tdL.idThread);
perror ("[Thread] Error at write(): firstLoginMenu to client.n");
} else {
printf ("[Thread %d] Message firstLoginMenu was sent succesfully.n",tdL.idThread);
}
// Reading the client's selected option 
int selectedOption; 
if (read(tdL.cl, &selectedOption, sizeof(int)) <= 0) {
printf("[Thread %d]n",tdL.idThread);
perror ("Error at read() from client.n");
}
printf("Message from clinet, selectedOption: %d", selectedOption);

不幸的是,最后两个打印都没有显示在服务器控制台中,我在客户端的最后部分发送selectedOption

// Reading size of first mesage: lenWelcomeMsg
if (read(sd, &lenWelcomeMsg, sizeof(int)) < 0) {
perror ("[client] Error reading len welcome message from server.n");
}
// Reading initial message from server: welcomeMessageFromServer
if (readAll(sd, welcomeMessageFromServer, lenWelcomeMsg) < 0) {
perror ("[client] Error reading welcome message from server.n");
return errno;
}
// Initial menu - Login Sign Up - message
char initialMenu[512];
int len_initialMenu;
// Reading size of first mesage: lenWelcomeMsg
if (read(sd, &len_initialMenu, sizeof(int)) < 0) {
perror ("[client] Error reading len_initialMenu from server.n");
}
// Reading initial menu - Login Sign Up - message from server: initialMenu
if (readAll(sd, initialMenu, len_initialMenu) < 0) {
perror ("[client] Error reading initialMenu message from server.n");
return errno;
}
printf("%s",welcomeMessageFromServer);
printf("n");
printf("%s",initialMenu);
printf("nnSelect your option...n");
// Sending message containing client selected option to the server  
if (write (sd, &selectedOption,sizeof(int)) <= 0) {
perror ("[client] Error at write() selectedOption from client to server.n");
return errno;
}

Clinet侧输出:

Welcome to Console Shopper!
1. Login.
2. Sign Up.

Select your option... 1

服务器端输出:

[Thread 0] Sending Welcome message to client:
Welcome to Console Shopper!
[Thread 0] Message initMsgToClient was sent succesfully.
[Thread 0] Sending first menu message to client:
1. Login.
2. Sign Up.
[Thread 0] Message firstLoginMenu was sent succesfully.

在处理if (read() <= 0)时,我预计至少会出现一个错误,但int selectedOption;以下的内容不会打印出来。

更新:找到了一个解决方案:在服务器上的最后一个printf中添加n可以解决问题,我仍然很困惑为什么一个简单的n会导致服务器停止打印,如果有人能花时间解释为什么会这样,我将不胜感激。我指的是:

printf("Message from clinet, selectedOption: %dn", selectedOption);
-------------------------^

在服务器上的最后一个printf中添加n解决了这个问题,我仍然很困惑为什么一个简单的n会导致服务器停止打印,如果有人能花时间解释为什么会这样,我将不胜感激。

您观察到的是标准C库中的stdout缓冲,请参阅man stdout:

stderr未缓冲。流CCD_ 12在其指向终端时被行缓冲。直到调用fflush(3)exit(3),或者打印新行,才会出现部分行。

相关内容

最新更新