帮我看看这个UDP通信的代码, 为什么会出问题?

classfree 2004-12-24 06:33:06
运行一段时间就会提示运行是错误. 时间没定,有时候很久没有出问题~~

#include <windows.h>
#include <winsock.h>
#include <tlhelp32.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")


DWORD WINAPI MyThreadProc(LPVOID lpParameter);
void RecvData();
BOOL EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable);
void KillProcess(char *filename1, char *filename2);
SOCKET sockfd;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
struct hostent *host;
DWORD TID = 0;
OSVERSIONINFO info;


//----------------------------------------------------------------------
BOOL APIENTRY DllMain( HINSTANCE hInstance,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
HANDLE hEvent = CreateEvent(NULL, FALSE, TRUE, "HDDGMon");
WORD wVersionRequested = MAKEWORD( 2, 2 );
WSADATA wsadata;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WSAStartup(wVersionRequested, &wsadata);
info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&info);
break;
case DLL_PROCESS_DETACH:
if(TID != 0)
{
PostThreadMessage(TID,WM_QUIT,0,0);
TID = 2;
}
WSACleanup();
break;
}

if(TID == 0)
{
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) != SOCKET_ERROR)
{
serv_addr.sin_port = htons(1790);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != SOCKET_ERROR)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadProc, 0, 0, &TID);
}
}
}
return TRUE;
}

void SpChar(char *input, OUT char *cmd, OUT char *spath, OUT char *apath)
{
char strtmp[256];
strcpy(strtmp, input);
char *temp;
char *p1;
char *p2;
char *p3;
try
{
for (p1=strtmp; *p1 != ','; p1++);//找逗号
*p1 = '\0';
temp = p1 + 1;
p1 = strtmp;

for(p2=temp; *p2!=','; p2++);
*p2 = '\0';
p3 = p2 + 1;
p2 = temp;
}
catch(...)
{
}
strcpy(cmd, p1);
strcpy(spath, p2);
strcpy(apath, p3);
}

void GetPath(TCHAR *sPath, OUT TCHAR *ourpath)
{
TCHAR sDrive[_MAX_DRIVE];
TCHAR sDir[_MAX_DIR];
TCHAR sFname[_MAX_FNAME];
TCHAR sExt[_MAX_EXT];

_splitpath(sPath, sDrive, sDir, sFname, sExt);

strcpy(ourpath, sDrive);
strcat(ourpath, sDir);

if(sPath[strlen(ourpath) - 1] != '\\')
strcat(ourpath, "\\");
}

void DeleteFolder(char *FolderPath, bool bShow)
{
char *buf;
int n = strlen(FolderPath);
buf = new char[n+4];
try
{
memset(buf, 0, n+4);
strcpy(buf, FolderPath);

SHFILEOPSTRUCT st;
memset(&st, 0, sizeof(SHFILEOPSTRUCT));

st.hwnd = NULL;
st.fFlags = FOF_MULTIDESTFILES|FOF_NOCONFIRMATION;
if(!bShow)
st.fFlags = st.fFlags|FOF_SILENT;
st.wFunc = FO_DELETE;
st.pFrom = buf;
st.pTo = NULL;
SHFileOperation(&st);
delete buf;
}
catch(...)
{
delete buf;
}
}

void RecvData()
{
try
{
char buf[512];
int namelen = sizeof(serv_addr);
recvfrom(sockfd, buf, 512, 0, (struct sockaddr *)&serv_addr, &namelen);

if(strlen(buf) > 2)
{
char msg[] = "#成功#";
char cmd[16];
char sourpath[256];
char amipath[256];
char temp[256];
SpChar(buf, cmd, sourpath, amipath);
if(stricmp(cmd, "#RUNFILE#") == 0)
{
//运行文件
GetPath(sourpath, temp);
ShellExecute(NULL, "Open", sourpath, amipath, temp, SW_NORMAL);
//sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
}
else if(stricmp(cmd, "#DELFILE#") == 0)
{
//删除文件
SetFileAttributes(sourpath, FILE_ATTRIBUTE_ARCHIVE);
DeleteFile(sourpath);
}
else if(stricmp(cmd, "#DELFOLDER#") == 0)
{
//删除目录
DeleteFolder(sourpath, false);
}
else if(stricmp(cmd, "#COPYFILE#") == 0)
{
//复制文件
CopyFile(sourpath, amipath, false);
}
else if(stricmp(cmd, "#MOVEFILE#") == 0)
{
//移动文件或者重命名
MoveFile(sourpath, amipath);
}
else if(stricmp(cmd, "#MSGBOX#") == 0)
{
//消息筐
MessageBox(NULL, sourpath, amipath, MB_OK|MB_ICONQUESTION);
}
else if(stricmp(cmd, "#KILLPROCESS#") == 0)
{
//结束进程
EnablePrivilege(SE_DEBUG_NAME, TRUE);
KillProcess(sourpath, amipath);
}
else if(stricmp(cmd, "#SLEEP#") == 0)
{
//进入休眠
if(info.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
EnablePrivilege(SE_SHUTDOWN_NAME, TRUE);
}
SetSystemPowerState(FALSE, TRUE);
}
else if(stricmp(cmd, "#REBOOT#") == 0)
{
//重新启动计算机
if(info.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
EnablePrivilege(SE_SHUTDOWN_NAME, TRUE);
}
ExitWindowsEx(EWX_FORCE|EWX_REBOOT, 0);
}
else if(stricmp(cmd, "#CLOSEPOWER#") == 0)
{
//关闭计算机
if(info.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
EnablePrivilege(SE_SHUTDOWN_NAME, TRUE);
//InitiateSystemShutdown(NULL, "即将关闭计算机", 1000, FALSE, TRUE);
}
ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN, 0);
}
}
}
catch(...)
{
}
}

DWORD WINAPI MyThreadProc(LPVOID lpParameter)
{
MSG msg;
UINT hTimer;
hTimer = SetTimer(NULL,NULL,10000,0);

while(GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_TIMER:
RecvData();
break;
default:
break;
}
}
if(hTimer)
KillTimer(NULL, hTimer);
return 0;
}

//提升权限
BOOL EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
BOOL ret;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ,
&hToken))
return FALSE;

if (!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
return FALSE;

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;

ret = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
CloseHandle(hToken);

return ret;
}

char * GetMyPath(char *fullpath)
{
char sDrive[_MAX_DRIVE];
char sDir[_MAX_DIR];
char sFname[_MAX_FNAME];
char sExt[_MAX_EXT];
_splitpath(fullpath, sDrive, sDir, sFname, sExt);

return strcat(sFname, sExt);
}
//结束进程
void KillProcess(char *filename1, char *filename2)
{
HANDLE snapshot;
PROCESSENTRY32 processinfo;
processinfo.dwSize = sizeof(processinfo) ;
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(snapshot == NULL)
return;

bool status = Process32First (snapshot, &processinfo);
while(status)
{
char *sFname;
sFname = GetMyPath(processinfo.szExeFile);
if(stricmp(filename1, sFname) == 0 || stricmp(filename2, sFname) == 0)
{
HANDLE handle = OpenProcess(PROCESS_TERMINATE, FALSE, processinfo.th32ProcessID);
TerminateProcess(handle, 0);
CloseHandle(handle);
}

status = Process32Next(snapshot, &processinfo);
}
CloseHandle(snapshot);
}
...全文
145 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
classfree 2004-12-25
  • 打赏
  • 举报
回复
再问一个:
我用的WINSOCKET,没有用控件.

服务器Server.exe打开UDP端口:8000, 每隔20秒接收一次数据,接收的是来自所有IP的数据.
假如现在接收到Client.exe发送过来的数据,
现在Server.exe想返回一个信息给Client.exe, Client.exe不另外开端口.
请问如何让Server.exe把信息返回到Client.exe发送数据的端口呢?
classfree 2004-12-25
  • 打赏
  • 举报
回复
出错, 好象是什么运行时错误, 什么溢出了~~~~~~~~

帮我看看那端计时线程有没有问题?
beyondtkl 2004-12-25
  • 打赏
  • 举报
回复
....太長了 大哥...就說哪裡錯 什麼錯。。。
nuaawenlin 2004-12-25
  • 打赏
  • 举报
回复
出错提示信息是什么?

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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