以下是我写的用管道绑定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;
   }
}
  

解决方案 »

  1.   

    一下子很难说清楚,楼主可以跟踪一下lstrcmp(recv_buff,"exitcmd\n"))==0这个语句,我觉得应该是这里有问题.
      

  2.   

    呵呵,
    lstrcmp(recv_buff,"exitcmd\n"))==0这里没错,可以执行的,不信你在后面加上一句exit(0)试试~~~!!!!是可以退出的,恩,可能说的不是很清楚,我是要求能让这个函数返回,实际上在我的项目中我可以调用这个功能,不过结果是我一但让程序进入了这个模块那么就一直在这个模块的管道中了,也就是进去了就出不来了,所以我想让这个模块返回~~~~!!!!!