⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadproc.cpp

📁 这是数据传输的代码
💻 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 + -