线程问题,莫名其妙

密斯刘 2010-06-30 09:57:15
我在main里面开了另外两个线程,然后在两个线程里面都有一个while死循环,我在死循环里面不断输出东西并sleep一下。
其实我是在写一个远程的cmdshell,一个读线程,一个写线程,匿名管道实现。

但是,其中一个线程运行不正常,代码如下:

DWORD WINAPI ThreadFuncWrite( LPVOID lpParam )
{
SECURITY_ATTRIBUTES pipeattr;
DWORD len;
int nRetCode;
unsigned long nCount;
unsigned long nAvail;

char send_buff[25000];
ZeroMemory(send_buff, 25000);

pipeattr.nLength = sizeof(SECURITY_ATTRIBUTES);
pipeattr.lpSecurityDescriptor = NULL;
pipeattr.bInheritHandle = TRUE;

nRetCode = CreatePipe(&hReadFile,
&hWritePipe,
&pipeattr,
0);
if (nRetCode == 0)
{
printf ("CreatePipe writepipe Error!\n");
exit(-1);
}
varWrite = 1;
while (true)
{
cout << "1" << endl;
Sleep(250);
cout << "2" << endl;
ReadFile(hReadFile,
send_buff,
25000,
&len,
NULL);
cout << "3" << endl;
if (len != 0)
{
if(SOCKET_ERROR == send(ClientSocket,
send_buff,
len,
0))
{
cout << "发送失败" << endl;
}
else
{
cout << "发送成功" << endl;
}
}
cout << "什么东西啊" << send_buff << endl;
}
return 0;
}

那个,我运行的时候,测试表明while循环莫名其妙的退出来了。因为我在中间输出了1 2 3等信息,只是输出了一次就没有再输出了。
还有一个是ThreadFuncRead,可以接收远端发过来要执行的命令并写入管道。那个线程工作正常。

这个不知道什么原因,找了好久都没看出来哪里错了。
...全文
114 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
密斯刘 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 smwhotjay 的回复:]

cmdshell不用把socket绑定到命名管道也可以啊.直接把socket绑定cmd.exe的输入和输出.
下面是代码
int cmdshell(SOCKET clientFD)
{
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDL……
[/Quote]
我试试 如果行的话 我把分全部给你
见习学术士 2010-07-01
  • 打赏
  • 举报
回复
改成这样

DWORD WINAPI ThreadFuncWrite( LPVOID lpParam )
{
try
{
while(1)
{
TrueWorker();//这个函数执行原线程里面的内容
}
}
catch (...)
{
//这里输出调试信息,如果异常
}
return 0;
}
smwhotjay 2010-07-01
  • 打赏
  • 举报
回复
cmdshell不用把socket绑定到命名管道也可以啊.直接把socket绑定cmd.exe的输入和输出.
下面是代码
int cmdshell(SOCKET clientFD)
{
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD;
char cmdLine[] = "cmd.exe";
PROCESS_INFORMATION ProcessInformation;
int ret;
//建立进程
ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
TerminateProcess(ProcessInformation.hProcess, 0);
CloseHandle(ProcessInformation.hProcess);
return 1;
}
密斯刘 2010-07-01
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100630/23/c3c4f6d0-0ff6-48e7-bbff-82e8dbac4764.html?seed=356706972&r=66628001#r_66628001
我另外发了贴,源代码都传上来了,帮忙看看吧
密斯刘 2010-07-01
  • 打赏
  • 举报
回复
我另外解决了,就是每次都创建管道,然后清理管道。
一次性创建总是不行 很不明白 可能我代码写错了
jay0708 2010-06-30
  • 打赏
  • 举报
回复
或者你排除法看看,把你的这个问题线程,改一下。改成最简单的。就让他输出1 2 3.再看看可不可以正常运行。以此类推,看看是不是代码的问题。不过我觉得即使里面有的函数调用失败也不至于你的while跳出。还是排除一下看看吧。
jay0708 2010-06-30
  • 打赏
  • 举报
回复
是不是你这个线程执行了一个时间片后,系统切换去执行其他的线程,而由于那个线程的优先级别高,导致你这个线程没有机会执行了呢?
密斯刘 2010-06-30
  • 打赏
  • 举报
回复
更加烦人的是 我第一次能够接收到结果 以后就接收不到了 也就是 服务端的while循环没了……我试了异常捕获,感觉没有用
密斯刘 2010-06-30
  • 打赏
  • 举报
回复
Telnet什么原理 那个程序可以用telnet连接,正常通信。
但是我自己写了个客户端,就不能正常通信,也就是我上面提到的问题了。

我都程序就是直接发命令过去,然后等待接收结果。

难道telnet还会发送额外的什么信息 但是我有服务端的代码 看了也就是直接收命令,没有其他的啊
jay0708 2010-06-30
  • 打赏
  • 举报
回复
GetLastError看看
雪影 2010-06-30
  • 打赏
  • 举报
回复
是不是哪行代码出现异常导致?

检测一下每次运行ReadFile、send 函数的情况,是否有异常抛出
密斯刘 2010-06-30
  • 打赏
  • 举报
回复
特别说明,其中这个不正常的线程运行了一次while循环里面的代码

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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