亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? datasocket.cpp

?? 在Linux下使用GCC編制的FTP服務器
?? CPP
字號:
#include <strings.h>
#include "Tools.h"
#include "CtrlSocket.h"
#include "DataSocket.h"

//用于數據傳輸的子線程入口點函數
void *CDataSocket::Dispatch(void *pvParam)
{
	CDataSocket *pThis=(CDataSocket *)pvParam;
	int iRet=-10;
	if(pThis->m_nRunType==LIST)
		iRet=pThis->List();
	else if(pThis->m_nRunType==RETR)
		iRet=pThis->Retr();
	else if(pThis->m_nRunType==STOR)
		iRet=pThis->Stor();
	pThis->Close();
	return (void *)iRet;
}

CDataSocket::CDataSocket()
{
	Close();
	m_dwThreadId=0;//現在還不能肯定新線程ID是否不為0!!!!
	m_bAllowRun=false;
}

CDataSocket::~CDataSocket()
{

}

//開始運行工作線程
int CDataSocket::Run(CDataSocket::RUN_TYPE nRunType)
{
	Stop();	
	m_bAllowRun=true;//置允許子線程運行標志
	m_nRunType=nRunType;
	pthread_create(
		&m_dwThreadId,
		NULL,
		Dispatch,
		this);
	return 0;
}

//停止工作線程
int CDataSocket::Stop()
{
	if(m_dwThreadId != 0){
		m_bAllowRun=false;
		pthread_join(m_dwThreadId,NULL);
		m_dwThreadId=0;
	}
	return 0;
}

int CDataSocket::PreparePasv()
{
	sockaddr_in addrIp,addrPort={0};
	size_t nSize=sizeof(sockaddr_in);
	unsigned int nSvrIp,nSvrPort;
	//
	getsockname(*(m_pSockCtrl),(sockaddr *)&addrIp,&nSize);
	nSvrIp=ntohl(addrIp.sin_addr.s_addr);
	m_sockListen.Create();
	if(m_sockListen.Bind(0)!=0){
		m_pSockCtrl->Response("450 Internal error.");
		return -1;
	}
	getsockname(m_sockListen,(sockaddr *)&addrPort,&nSize);
	nSvrPort=ntohs(addrPort.sin_port);
	listen(m_sockListen,1);
	m_nConnType=PASV;
	m_pSockCtrl->Response(
		"227 Entering Passive Mode (%d,%d,%d,%d,%d,%d).",
		nSvrIp>>24 & 0xff,
		nSvrIp>>16 & 0xff,
		nSvrIp>>8 & 0xff,
		nSvrIp & 0xff,
		nSvrPort>>8 & 0xff,
		nSvrPort>>0 & 0xff);
	return 0;
}

int CDataSocket::PreparePort(const char *pszAddr)
{
	unsigned int nAddr[6];
	int iRet=sscanf(
		pszAddr,
		"%u,%u,%u,%u,%u,%u",
		nAddr+0,
		nAddr+1,
		nAddr+2,
		nAddr+3,
		nAddr+4,
		nAddr+5);
	if(iRet!=6){
		m_pSockCtrl->Response("501 Invalid parameter.");
		return -1;
	}
	m_nClientIp=nAddr[0]<<24 |
	 			nAddr[1]<<16 |
				nAddr[2]<<8	 |
				nAddr[3];
	m_nClientPort=nAddr[4]<<8 | nAddr[5];	
	m_nConnType=PORT;
	m_pSockCtrl->Response("200 Port command successful.");
	return 0;
}

int CDataSocket::List()
{
	int iRet,iSent=0;
	//
	if(Connect()!=0)
		return -1;
	while(m_bAllowRun && iSent<(int)m_sList.length()){
		iRet=Send(m_sList.c_str()+iSent,m_sList.length()-iSent);
		if(iRet<1 && errno!=EWOULDBLOCK){
			break;
		}
		iSent+=iRet;
	}
	m_pSockCtrl->Response("260 Transfer complete.");
	return iSent;
}

int CDataSocket::Retr()
{
	int iRet;
	FILE *pStream=NULL;
	char chBuf[512],*pchHead,*pchTail;//尾指針指向第1個無效字節
	bool bReadFileContinue=true;
	//
	if(Connect()!=0)
		return -1;
	pStream=fopen(m_sFile.c_str(),"rb");
	if(pStream==NULL){
		m_pSockCtrl->Response("550 open file failed.");
		return -2;
	}
	pchHead=pchTail=chBuf;
	while(m_bAllowRun){
		if(bReadFileContinue && pchHead>=pchTail){
			iRet=fread(chBuf,1,sizeof(chBuf),pStream);
			if(iRet>0){
				pchHead=chBuf;
				pchTail=pchHead+iRet;
			}
			bReadFileContinue=(iRet>0);		
		}
		if(pchHead>=pchTail)
			break;
		iRet=Send(pchHead,pchTail-pchHead);
		if(iRet<1 && errno!=EWOULDBLOCK){
			break;
		}
		pchHead+=iRet;
	}
	fclose(pStream);
	m_pSockCtrl->Response("260 Transfer complete.");
	return 0;
}

int CDataSocket::Stor()
{
	int iRet,iAllTime;
	FILE *pStream=NULL;
	char chBuf[512];//尾指針指向第1個無效字節
	//
	if(Connect()!=0)
		return -1;
	pStream=fopen(m_sFile.c_str(),"wb");
	if(pStream==NULL){
		m_pSockCtrl->Response("550 open file failed.");
		return -2;
	}
	while(m_bAllowRun){
		iRet=Recv(chBuf,sizeof(chBuf));
		if(iRet==0){
			break;//對方斷開連接
		}
		if(iRet>0){
			if(iRet!=(int)fwrite(chBuf,1,iRet,pStream)){
				break;
			}
			iAllTime=0;
		}else if(errno!=EWOULDBLOCK){
			break;
		}
		if(++iAllTime>(m_iTimeout/TIME_SLICE))
			break;
	}
	fclose(pStream);
	m_pSockCtrl->Response("260 Transfer complete.");
	return 0;
}

int CDataSocket::Connect()
{
	int iRet=-1;
	if(m_nConnType==PORT){
		Create();
		iRet=CMySocket::Connect(m_nClientIp,m_nClientPort);
	}else if(m_nConnType==PASV){
		//accept不能設置超時,通過采用非阻塞模式和select來
		//檢查客戶端的連接超時
		m_sockListen.SetBlockMode(false);
		fd_set setRead;
		int iAllTime=0;
		timeval timeout;
		timeout.tv_sec=TIME_SLICE/1000;	//1秒
		timeout.tv_usec=0;
		FD_ZERO(&setRead);	
		//
		while(m_bAllowRun){//每1000毫秒循環一次
			FD_SET(m_sockListen,&setRead);//捕捉接收連接事件
			if(select(m_sockListen+1,&setRead,NULL,NULL,&timeout)<0)
				break;
			if(FD_ISSET(m_sockListen,&setRead)){//來了連接請求
				Detach();
				m_sockListen.Accept(this);
				m_sockListen.Close();
				iRet=0;
				break;
			}
			if(++iAllTime>(m_iTimeout/TIME_SLICE))
				break;
		}
	}
	if(iRet==0){
		SetTimeout(TIME_SLICE);
		m_pSockCtrl->Response("150 Connect succeed.");
	}else{
		m_pSockCtrl->Response("425 Can't open data connection.");
	}
	return iRet;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区四区高清| 国产成人欧美日韩在线电影| 久久久一区二区| 91免费看片在线观看| 久久国产免费看| 亚洲国产成人av| 国产精品超碰97尤物18| 日韩一区二区视频| 欧美在线免费观看亚洲| 高清成人免费视频| 麻豆精品新av中文字幕| 一区二区三区蜜桃| 国产精品色哟哟网站| 欧美一区二区成人| 国产三级精品三级| 老汉av免费一区二区三区| 日韩亚洲国产中文字幕欧美| 中文字幕av资源一区| 久久99热99| 久久久久九九视频| 亚洲aaa精品| 日本乱人伦aⅴ精品| 亚洲在线视频免费观看| 欧美精品视频www在线观看| 国产宾馆实践打屁股91| 亚洲欧美日韩人成在线播放| 成人国产精品免费观看视频| 欧美日韩一级片在线观看| 国产精品无码永久免费888| 91在线视频在线| 日产欧产美韩系列久久99| 国产99久久久精品| 99精品久久久久久| 精品嫩草影院久久| 亚洲免费在线视频| 另类的小说在线视频另类成人小视频在线 | 国产高清在线精品| 久久夜色精品国产欧美乱极品| 成人美女视频在线观看| 亚洲另类在线一区| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲乱码国产乱码精品精小说 | 欧美三级日韩三级| 91视频在线看| 99r国产精品| 色综合久久六月婷婷中文字幕| 成人免费黄色在线| av中文字幕亚洲| 97se亚洲国产综合自在线| 99精品视频一区二区三区| 91在线看国产| 在线看不卡av| 欧美视频一区二区| 91精品欧美久久久久久动漫| 在线不卡一区二区| 26uuu国产电影一区二区| 久久久精品免费观看| 国产精品网曝门| 亚洲精品久久久蜜桃| 亚洲成人免费影院| 久久国产麻豆精品| 国产成人午夜99999| 91蜜桃婷婷狠狠久久综合9色| 欧美在线观看视频在线| 日韩一区二区三区视频| 久久久久久久综合| 亚洲乱码精品一二三四区日韩在线| 亚洲成人av资源| 国产一二精品视频| 色诱视频网站一区| 日韩免费在线观看| 自拍偷拍欧美激情| 婷婷六月综合网| 国产一区在线观看麻豆| 波多野结衣中文字幕一区二区三区 | 国产精品影音先锋| 成人午夜激情片| 欧美日韩国产不卡| 国产亚洲成av人在线观看导航 | 国产校园另类小说区| 综合婷婷亚洲小说| 久久精品二区亚洲w码| 波多野结衣亚洲| 91精品国产日韩91久久久久久| 国产喂奶挤奶一区二区三区| 亚洲国产精品久久久久秋霞影院| 久久99国产精品麻豆| 99九九99九九九视频精品| 日韩一区二区麻豆国产| 中文字幕一区二区三区在线观看 | 波多野结衣中文字幕一区二区三区 | 99国产精品国产精品久久| 欧美区在线观看| 国产精品污污网站在线观看| 天堂久久久久va久久久久| 国产高清久久久久| 91精品国产一区二区三区| 国产精品毛片无遮挡高清| 蜜臀a∨国产成人精品| 91麻豆精品在线观看| 久久久不卡网国产精品二区| 亚洲超丰满肉感bbw| a级高清视频欧美日韩| 精品国产制服丝袜高跟| 亚洲成人自拍一区| 99久久99久久久精品齐齐| 亚洲精品一区二区三区福利| 婷婷丁香激情综合| 在线免费av一区| 综合婷婷亚洲小说| 成人免费视频免费观看| 精品国免费一区二区三区| 日本不卡一区二区三区| 日本久久电影网| 国产精品麻豆久久久| 国产精品1区二区.| 欧美精品一区二区三区在线播放| 亚洲一卡二卡三卡四卡五卡| 99国产精品一区| 国产女人18毛片水真多成人如厕| 久久精品国产免费| 欧美成人一区二区| 日本不卡在线视频| 欧美一卡2卡3卡4卡| 亚洲第一电影网| 一本在线高清不卡dvd| 成人免费小视频| 99久久久精品| 中文字幕亚洲电影| 99久久精品免费看| 国产精品二区一区二区aⅴ污介绍| 国产精品综合av一区二区国产馆| 日韩欧美国产一区在线观看| 日韩电影免费一区| 欧美一区二区三区四区在线观看| 天堂在线一区二区| 91精品国产综合久久香蕉的特点 | 国产精品白丝av| 久久一区二区三区四区| 国产福利不卡视频| 中国色在线观看另类| 成人黄色av网站在线| 中文字幕中文在线不卡住| 99久久婷婷国产| 一区二区在线电影| 欧美挠脚心视频网站| 日韩和欧美一区二区| 日韩三级电影网址| 国内精品自线一区二区三区视频| 欧美精品一区二区在线播放| 成人午夜在线免费| 亚洲欧美日韩久久精品| 欧美日韩免费在线视频| 免费成人在线影院| 久久久久久**毛片大全| 99久久er热在这里只有精品15| 亚洲一区二区三区四区中文字幕| 欧美久久免费观看| 国产一区二区三区不卡在线观看 | 美腿丝袜亚洲一区| 久久久噜噜噜久久人人看| 99在线视频精品| 亚洲成av人片一区二区梦乃| 久久综合九色综合97婷婷女人 | 99精品欧美一区二区三区小说 | 国产成人免费在线观看| 一区二区三区四区av| 91精品国产高清一区二区三区| 黄色小说综合网站| 亚洲日本韩国一区| 日韩一区二区免费视频| 99精品在线免费| 久久精品国产亚洲一区二区三区 | 中文字幕欧美一区| 欧美精品一卡两卡| 国产精选一区二区三区| 亚洲综合成人网| 久久精品一区二区三区四区| 欧洲另类一二三四区| 国产精品一区二区久激情瑜伽| 中文字幕一区二区三区精华液| 欧美精品自拍偷拍动漫精品| 粉嫩绯色av一区二区在线观看| 亚洲综合丁香婷婷六月香| 久久综合色婷婷| 欧美日韩一区不卡| 国产成人av资源| 日韩国产欧美视频| 亚洲丝袜精品丝袜在线| 欧美成人乱码一区二区三区| 91在线观看一区二区| 国产专区综合网| 亚洲成人综合网站| 亚洲三级电影全部在线观看高清| 欧美草草影院在线视频| 欧美在线观看禁18| 大桥未久av一区二区三区中文| 三级不卡在线观看| 亚洲精选一二三| 国产精品免费av|