www.pudn.com > 数据传输局域网.rar > 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>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;i255) 
				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; 
}