在编写我的服务器代码时,我有这一行:
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
当我运行程序时,我没有收到任何错误,但程序只是冻结了,我在第一行放置了一个打印语句main()
(因此它应该在任何运行之前运行)但打印语句永远不会被执行。
这行代码绝对是问题所在,因为一旦我将其注释掉,我的打印语句就会起作用。
什么会造成这种奇怪的行为?
(我不允许发布作业代码,所以很遗憾我不能全部发布)
在编写我的服务器代码时,我有这一行:
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
当我运行程序时,我没有收到任何错误,但程序只是冻结了,我在第一行放置了一个打印语句main()
(因此它应该在任何运行之前运行)但打印语句永远不会被执行。
这行代码绝对是问题所在,因为一旦我将其注释掉,我的打印语句就会起作用。
什么会造成这种奇怪的行为?
(我不允许发布作业代码,所以很遗憾我不能全部发布)
由于这显然是答案,我将在此处写下它:如果您的printf
格式字符串不以“ \n
”结尾,那么它们将被缓冲,直到您打印换行符或您的程序退出。(我正在简化一点。)由于您的accept
调用在该输出被缓冲后停止了您的程序,因此即使printf
调用工作正常,您也看不到输出。
您的另一个选择是fflush()
,stdout
这将强制它“打印”任何缓冲的内容,而不管'\n'
:
printf("print this now!");
fflush(stdout);
它正在等待连接。这就是accept
函数的目的。