📄 threadproc.cpp
字号:
#include "ThreadProc.h"
#include "io.h"
#include "sys/stat.h"
void GetFileName(char *pPathName,char *pFileName)
{
int n;
n = strlen(pPathName);
while(pPathName[--n]!='\\')
;
strcpy(pFileName,&pPathName[n+1]);
}
void GetFilePath(char *pPathName,char *pPath)
{
int n;
n = strlen(pPathName);
while(pPathName[--n]!='\\')
;
memcpy(pPath,pPathName,n);
pPath[n]=0;
}
void GetFileExtention(char *pFileName,char *pName,char *pExt)
{
int i,n;
pName[0]=0;
pExt[0]=0;
n=strlen(pFileName);
for(i=0;i<n;i++)
{
if(pFileName[i]=='.')
break;
}
memcpy(pName,pFileName,i);
pName[i]=0;
strcpy(pExt,&pFileName[i+1]);
}
void VerifyFileName(char *p)
{
int n;
char tmp[512];
char dir[256],name[128];
char file[128],ext[32];
n=1;
strcpy(tmp,p);
GetFileName(p,name);
GetFilePath(p,dir);
GetFileExtention(name,file,ext);
while(access(tmp,0)==0)
{
sprintf(tmp,"%s\\%s(%d).%s",dir,file,n++,ext);
}
strcpy(p,tmp);
}
void DWORD2BYTE(char *p,DWORD dw)
{
unsigned char tmp[4];
tmp[0]=(unsigned char) (dw>>24)&0x000000ff;
tmp[1]=(unsigned char) (dw>>16)&0x000000ff;
tmp[2]=(unsigned char) (dw>> 8)&0x000000ff;
tmp[3]=(unsigned char) (dw)&0x000000ff;
memcpy(p,tmp,4);
}
DWORD BYTE2DWORD(char *p)
{
DWORD dw;
unsigned char tmp[4];
memcpy(tmp,p,4);
dw = ( ((DWORD)tmp[0])<<24 &0xff000000 )|
( ((DWORD)tmp[1])<<16 &0x00ff0000 )|
( ((DWORD)tmp[2])<<8 &0x0000ff00 )|
( ((DWORD)tmp[3]) &0x000000ff );
return dw;
}
UINT ServiceProc(LPVOID lp)
{
// return 0;}
SERVICEPARM *p=(SERVICEPARM*)lp;
SOCKET s;
sockaddr_in addr;
int addrlen;
SERVICEPARM *pTmp;
while(1)
{
addrlen = sizeof(addr);
s = accept(p->sockservice,(struct sockaddr*)&addr,&addrlen);
if(s==INVALID_SOCKET)
{
break;
}
else
{
pTmp = (SERVICEPARM *)malloc(sizeof(SERVICEPARM));
pTmp->hwndServerDlg=p->hwndServerDlg;
strcpy(pTmp->path,p->path);
pTmp->sockservice=s;
if(AfxBeginThread(RecvDataProc,pTmp))
{}
else
{
closesocket(s);
free(pTmp);
}
}
}
::SendMessage(p->hwndServerDlg,WM_THREADMSG,MSG_SERVICE_STOP,(LPARAM)0);
Sleep(800);
return 0;
}
UINT RecvDataProc(LPVOID p)
{
SERVICEPARM *pTmp;
FILE *fd=NULL;
pTmp=(SERVICEPARM *)p;
struct timeval tv;
fd_set readset;
int selret;
char buf[BUF_LEN];
int readlen;
DWORD nFileLen,nLeftLen;
char msg[1024];
// recv file name
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
tv.tv_sec = TIMEOUT;
tv.tv_usec= 0;
selret = select(pTmp->sockservice+1,&readset,NULL,NULL,&tv);
if(selret==0 || selret==SOCKET_ERROR)
{
closesocket(pTmp->sockservice);
free(pTmp);
return 1;
}
readlen=recv(pTmp->sockservice,buf,BUF_LEN,0);//receive file name
if(readlen==0 || readlen==SOCKET_ERROR)
{
closesocket(pTmp->sockservice);
free(pTmp);
return 1;
}
else
{
buf[readlen]=0;
}
strcat(pTmp->path,"\\");
strcat(pTmp->path,buf);
VerifyFileName(pTmp->path);
fd=fopen(pTmp->path,"wb");
if(fd==NULL)
{
sprintf(msg,"打开文件%s失败!\r\n",pTmp->path);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
return 2;
}
send(pTmp->sockservice,"OK",2,0);
//recv file length
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
tv.tv_sec = TIMEOUT;
tv.tv_usec= 0;
selret = select(pTmp->sockservice+1,&readset,NULL,NULL,&tv);
if(selret==0 || selret==SOCKET_ERROR)
{
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
readlen=recv(pTmp->sockservice,buf,4,0);//receive file length
if(readlen !=4 )
{
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nFileLen = BYTE2DWORD(buf);
send(pTmp->sockservice,"OK",2,0);
//recv file data
sprintf(msg,"正在接收文件%s...\r\n",pTmp->path);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
nLeftLen = nFileLen;
while(nLeftLen)
{
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
tv.tv_sec = TIMEOUT+12;
tv.tv_usec= 0;
// FILE *fd;
selret = select(pTmp->sockservice+1,&readset,NULL,NULL,&tv);
if(selret==0 || selret==SOCKET_ERROR)
{
sprintf(msg,"接收文件数据超时0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
Sleep(500);
closesocket(pTmp->sockservice);
fclose(fd);
free(pTmp);
return 1;
}
readlen=recv(pTmp->sockservice,buf,BUF_LEN,0);
if(readlen==0 || readlen==SOCKET_ERROR)
{
sprintf(msg,"接收文件数据出错,客户端可能关闭连接。0x%08x\r\n",readlen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
Sleep(500);
closesocket(pTmp->sockservice);
fclose(fd);
free(pTmp);
return 1;
}
else
{
fwrite(buf,1,readlen,fd);
nLeftLen -= readlen;
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_RECV_DATA,readlen);
fflush(fd);
}
}
sprintf(msg,"接收文件完成!\r\n");
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
fclose(fd);
closesocket(pTmp->sockservice);
free(pTmp);
return 0;
}
UINT SendDataProc(LPVOID p)
{
SERVICEPARM *pTmp =(SERVICEPARM *)p ;
FILE *fd;
char buf[BUF_LEN];
int nReadLen,nTotalLen,nLeftLen,nSendLen;
struct stat filestat;
struct timeval tv;
fd_set readset;
int selret;
char msg[1024];
stat(pTmp->path,&filestat);
nTotalLen = filestat.st_size;
nLeftLen = nTotalLen;
fd=fopen(pTmp->path,"rb");
if(fd==NULL)
{
sprintf(msg,"打开文件%s失败!\r\n",pTmp->path);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
return 1;
}
GetFileName(pTmp->path,buf);
//send file name
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
selret = select(pTmp->sockservice+1,NULL,&readset,NULL,&tv);
if(selret==0||selret==SOCKET_ERROR)
{
sprintf(msg,"Send File Name fail, select result: 0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nSendLen = send(pTmp->sockservice,buf,strlen(buf),0);
if((unsigned int)nSendLen!=strlen(buf))
{
sprintf(msg,"Send File Name fail, send result: 0x%08x\r\n",nSendLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
selret = select(pTmp->sockservice+1,&readset,NULL,NULL,&tv);
if(selret==0||selret==SOCKET_ERROR)
{
sprintf(msg,"select result: 0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nSendLen=recv(pTmp->sockservice,buf,2,0);
if(nSendLen!=2)
{
sprintf(msg,"recv result: 0x%08x\r\n",nSendLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
//send file length /
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
selret = select(pTmp->sockservice+1,NULL,&readset,NULL,&tv);
if(selret==0||selret==SOCKET_ERROR)
{
sprintf(msg," select result: 0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
DWORD2BYTE(buf,(DWORD)nTotalLen);
nSendLen = send(pTmp->sockservice,buf,4,0);
if(nSendLen!=4)
{
sprintf(msg,"Send File len fail, send result: 0x%08x\r\n",nSendLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
selret = select(pTmp->sockservice+1,&readset,NULL,NULL,&tv);
if(selret==0||selret==SOCKET_ERROR)
{
sprintf(msg," select result: 0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nSendLen=recv(pTmp->sockservice,buf,2,0);
if(nSendLen!=2)
{
sprintf(msg,"recv result: 0x%08x\r\n",nSendLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
/// send file data //////////////////////////////////////////////////////
sprintf(msg,"正在发送文件%s...\r\n",pTmp->path);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
while(nLeftLen)
{
nReadLen=fread(buf,1,BUF_LEN,fd);
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&readset);
FD_SET(pTmp->sockservice,&readset);
selret = select(pTmp->sockservice+1,NULL,&readset,NULL,&tv);
if(selret==0||selret==SOCKET_ERROR)
{
sprintf(msg,"发送文件数据出错,可能连接被断开。select result: 0x%08x\r\n",selret);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nSendLen = send(pTmp->sockservice,buf,nReadLen,0);
if(nSendLen != nReadLen)
{
sprintf(msg,"发送文件数据出错,可能连接被断开。send result: 0x%08x\r\n",nSendLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 1;
}
nLeftLen -= nReadLen;
//sprintf(msg,"%d/%d\r\n",nLeftLen,nTotalLen);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SEND_DATA,(LPARAM)nReadLen);
if (pTmp->nTime > 0)
Sleep(pTmp->nTime);
}
sprintf(msg,"发送文件%s完成!\r\n",pTmp->path);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_SHOWMSG,(LPARAM)&msg[0]);
::SendMessage(pTmp->hwndServerDlg,WM_THREADMSG,MSG_THREADEXIT,(LPARAM)0);
closesocket(pTmp->sockservice);
free(pTmp);
fclose(fd);
return 0;
}
int CheckAddrType(char *addr ,DWORD *dw)
{
char p[512];
int n,i,dotnumber,j;
n=strlen(addr);
int k[4];
memset(p,0,sizeof(p));
*dw=0;
j=0;
dotnumber=0;
for(i=0;i<n;i++)
{
if(addr[i]=='.')
{
p[j]=0;
k[dotnumber]=atoi(p);
if(k[dotnumber]>255)
return 0;
dotnumber++;
if(dotnumber>3)
return 0;
j=0;
continue;
}
else if( (addr[i]<='9') && (addr[i]>='0') )
{
p[j++]=addr[i];
}
else
{
return 0;
}
}
p[j]=0;
k[3]=atoi(p);
*dw=(k[0]<<24)&0xff000000 |
(k[1]<<16)&0x00ff0000 |
(k[2]<<8) &0x0000ff00 |
(k[3])&0x000000ff;
return 1;
}
int GetAddr(char *addr ,DWORD *dwip)
{
struct hostent *ht;
//strcpy(addr,(char*)(LPCTSTR)this->m_strAddr);
if(!CheckAddrType(addr,dwip))
{
ht=gethostbyname(addr);
if(ht)
{
memcpy(dwip,ht->h_addr_list[0],4);
*dwip=htonl(*dwip);
}
else
{
return 1;
}
}
return 0;
}
int WINAPI C_BrowsePath(HWND hwndParent,char *pPath,char *pDisplayString)
{
BROWSEINFO bi;
LPITEMIDLIST p;
char a[MAX_PATH+1];
bi.hwndOwner =hwndParent;
bi.pidlRoot=NULL;
bi.pszDisplayName=a;
bi.lpszTitle =pDisplayString;
bi.ulFlags =BIF_RETURNONLYFSDIRS |0x0040;//BIF_NEWDIALOGSTYLE
bi.lpfn =NULL;
bi.lParam =0;
bi.iImage =0;
pPath[0]=0;
p=SHBrowseForFolder(&bi);
if(p)
{
if(SHGetPathFromIDList(p,a))
{
strcpy(pPath,a);
return 0;
}
else
{
return 1;
}
}
else
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -