练习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)
,或者打印新行,才会出现部分行。