在运行控制台程序的时候,按下Ctrl+C程序就会马上终止吗?
今天在学习网络的时候发现一个小问题,问题是这样的:
我在控制台下面写了一个UDPServer和一个UDPClient,其中UDPServer只负责recv数据并显示到控制台上,而UDPClient则接受用户的输入并发送到UDPServer。我的问题是,比如我在UDPClient中输入指定条数的数据让程序正常退出,那么程序没有任何问题,但是如果我输入了一条数据以后,按下Ctrl+C强制退出UDPClient,那么之前留在缓冲区里面的数据会被再次发送一遍。
比如说,我在UDPClient里面输入 nihaoma? , UDPServer正确的接受了这条语句并且将它显示出来,这时候我用Ctrl+C退出UDPClient,UDPServer又一次收到了一条 nihaoma? ,请问这是怎么回事?按下Ctrl+C后,它后面的代码也会执行吗?如果执行的话,在怎么样的条件下会执行,怎么样又不执行呢?
附UDPClient在发送那一部分的代码:
for(i = 0 ; i != dwCount ; ++i) { gets(sendbuf); //按下Ctrl+C的时候,程序应该是阻塞在这一条语句的 ret = sendto(s,sendbuf,dwLength,0,(sockaddr *)&recipent,sizeof(recipent)); printf("sendto message[%d]\n",++times); //但是这里的语句也被执行了 if(ret == SOCKET_ERROR) { printf("sendto() failed with error %d\n",WSAGetLastError()); break; } else if(ret == 0) { break; } }
/********************************************************************** FUNCTION: demoSetCtrlHandler(HANDLE hConOut) ** ** PURPOSE: demonstrate SetConsoleCtrlHandler by setting a ctrl+break ** and ctrl+c handler. When the user hits either one of ** these keys, a message is printed to the console ** indicating the event. ** ** INPUT: the output handle to write to **********************************************************************/void demoSetCtrlHandler(HANDLE hConOut){ BOOL bSuccess; setConTitle(__FILE__); hConsole = hConOut; /* set global console output handle for handler */ myPuts(hConOut, "Let's install a ctrl+c and ctrl+break handler for this\n" "process. Hit ctrl+c and ctrl+break a few times to test\n" "the handler. Hit enter to return..."); /* set handler for this process */ bSuccess = SetConsoleCtrlHandler(handler_routine, TRUE); PERR(bSuccess, "SetConsoleCtrlHandler"); /* wait for user to hit enter */ while (myGetchar() != 0xd) ; /* now let's generate some control events */ myPuts(hConOut, "Now we'll use GenerateConsoleCtrlEvent to generate a\n" "ctrl+c and a ctrl+break event...\n"); bSuccess = GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); PERR(bSuccess, "GenerateConsoleCtrlEvent"); bSuccess = GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0); PERR(bSuccess, "GenerateConsoleCtrlEvent"); Sleep(1000); /* give ctrl handle time to output messages */ myPuts(hConOut, "\nNow choose 'Close' then 'Cancel' from the system\n" "menu of this console and note that we receive a\n" "CTRL_CLOSE_EVENT...\n"); myPuts(hConOut, "\nHit enter to continue..."); myGetchar(); /* remove our handler from the list of handlers */ bSuccess = SetConsoleCtrlHandler(handler_routine, FALSE); PERR(bSuccess, "SetConsoleCtrlHandler"); return;}
[解决办法]
以上代码节选自:
console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\
http://download.csdn.net/detail/zhao4zhong1/3461309
[解决办法]
特在此重现莫名其妙隐身的6楼
/********************************************************************** FUNCTION: demoSetCtrlHandler(HANDLE hConOut) ** ** PURPOSE: demonstrate SetConsoleCtrlHandler by setting a ctrl+break ** and ctrl+c handler. When the user hits either one of ** these keys, a message is printed to the console ** indicating the event. ** ** INPUT: the output handle to write to **********************************************************************/void demoSetCtrlHandler(HANDLE hConOut){ BOOL bSuccess; setConTitle(__FILE__); hConsole = hConOut; /* set global console output handle for handler */ myPuts(hConOut, "Let's install a ctrl+c and ctrl+break handler for this\n" "process. Hit ctrl+c and ctrl+break a few times to test\n" "the handler. Hit enter to return..."); /* set handler for this process */ bSuccess = SetConsoleCtrlHandler(handler_routine, TRUE); PERR(bSuccess, "SetConsoleCtrlHandler"); /* wait for user to hit enter */ while (myGetchar() != 0xd) ; /* now let's generate some control events */ myPuts(hConOut, "Now we'll use GenerateConsoleCtrlEvent to generate a\n" "ctrl+c and a ctrl+break event...\n"); bSuccess = GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); PERR(bSuccess, "GenerateConsoleCtrlEvent"); bSuccess = GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0); PERR(bSuccess, "GenerateConsoleCtrlEvent"); Sleep(1000); /* give ctrl handle time to output messages */ myPuts(hConOut, "\nNow choose 'Close' then 'Cancel' from the system\n" "menu of this console and note that we receive a\n" "CTRL_CLOSE_EVENT...\n"); myPuts(hConOut, "\nHit enter to continue..."); myGetchar(); /* remove our handler from the list of handlers */ bSuccess = SetConsoleCtrlHandler(handler_routine, FALSE); PERR(bSuccess, "SetConsoleCtrlHandler"); return;}
[解决办法]