我想做一个socket服务端,用于接收从多个客户端发过来的讯息,然后开始用FTP下载文件。
目前的做法流程如下:UI起来后,开启一个socket的线程,等待客户端的信息,当接收到第一个客户端的信息后,就开始使用FTP下载文件。但是发现,当第一个客户端连接进来,服务端开始下载文件后,服务端就在等着当前的FTP完成,无法再接收新的客户端的请求。
我想是不是FTP也需要用线程来完成?如果是FTP线程在文件下载结束后如何自动关闭,并通知到socket线程?还是说有别的很好的解决方法? total的,请各位指教,谢谢
目前的做法流程如下:UI起来后,开启一个socket的线程,等待客户端的信息,当接收到第一个客户端的信息后,就开始使用FTP下载文件。但是发现,当第一个客户端连接进来,服务端开始下载文件后,服务端就在等着当前的FTP完成,无法再接收新的客户端的请求。
我想是不是FTP也需要用线程来完成?如果是FTP线程在文件下载结束后如何自动关闭,并通知到socket线程?还是说有别的很好的解决方法? total的,请各位指教,谢谢
解决方案 »
- 如何上工具栏的字体和菜单的字体一致?
- vc如何判断一个字符串是否是合法目录
- 调用SOAP时出现这些错误,为什么呢?
- socket 建立的连接 能发送 就代表能接收吗?
- C++数据统计问题
- 从今天开始,再次拜师学艺.散分给前20位
- _ConnectionPtr m_pConnection在MFC常规DLL中m_pConnection.Release()失败!(在线等待,可出到1000分)
- 如何把CString型转换成CTime型,并判断时间值是否合法?
- ado中如何读字段的值
- 视图中有多个控件,鼠标移动时,如何得到鼠标所在位置下控件ID,用WindowFromPoint得到的是HWnd,能否转换为IDC_BUTTON1之类的ID值
- 还是关于cstdiofile的问题
- 请高手帮忙调试一下
socket线程如果用异步的方法可以吗?有点糊涂的。
你这个FTP是单独的软件?
目前的做法会产生阻塞,当socket线程开启FTP下载文件后,就无法响应后来的连接请求了。
你自己写的ftp下载? 如果你是阻塞处理的那就没办法了。只能改进的你的处理机制。一般ftp都用的网上开源的那个修改的。不会出现你说的问题。如果你说的多客户端不是很多。那你可以单独起线程做这个。不过还是很恶心的。
我也是不想恶心单独起线程来做,所以才发帖过来问,看有没有别的解决方法啊。
异步socket可以吗?在socket那边改不知道能不能解决这个问题,再有你说要改进出来机制,该如何改进呢,请多多指教哦
就是当第一个客户端要求服务器开FTP去下载文件(size > 10G)后,服务器就停在那边了,等FTP完成才会跳出循环(如果不等的话,是否有其他办法知道FTP文件已经下载完成,或是FTP下载出问题了呢?),再响应其他客户端的请求,但是我想的是服务器端能实时响应,并且告诉客户端当前状态(这个文件不在,或是这个文件正在FTP下载中)请各位了解的,知道的,多多指点,谢谢
良好的处理是:不论何种情况,立刻迅速的给客户端一个回馈。如:
1. "OK", "文件可用。"
2. "FAIL 1", "文件不可用,正尝试获取,大约需要%d小时%d分钟,请耐心等候。"
3. "FAIL 2", "文件不可用,已经尝试获取但失败,请报告管理员,或者尝试其他的资源。"立刻让客户了解结果是很重要的,并且不会让下一个客户一直阻塞在等待状态。
不好意思,再请教下,socket部分该如何修改?
我的UI只开了一个socket线程,然后在里面用accept方法来支持多个连接,现在看起来这样也是不行的,如下代码:
UINT StartSocketServer(LPVOID lParam)
{
//初始化socket
while(1)
{
if(!aSocket.Accept(serverSocket))
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0};
serverSocket.Receive(szRecvMsg, 256);
sprintf(szOutMsg, ">>>Receive PN info: %s \r\n", szRecvMsg);
aDlg->m_clog.SetSel(-1, -1);
aDlg->m_clog.ReplaceSel(szOutMsg);
int r;
r = aDlg->CheckPN(szRecvMsg); //检查PN号码是否可以使用
switch(r)
{
case 0:
serverSocket.Send("PNCHECKPASS", 11);
break;
case 1:
serverSocket.Send("PNCHECKFAIL", 11);
break;
case 2:
serverSocket.Send("SERVERWASDOWNLOADING", 20);
//start FTP to download file
aDlg->m_pFtpConnection = NULL;
try
{
//connect to ftp
aDlg->m_pFtpConnection = aDlg->m_Session.GetFtpConnection(aDlg->c_nasip, "anonymous", "[email protected]", INTERNET_INVALID_PORT_NUMBER);
......
//close ftp, but keep internet session
aDlg->m_pFtpConnection->Close();
if(aDlg->m_pFtpConnection != NULL)
delete aDlg->m_pFtpConnection;
}
catch(CInternetException *pEx)
{
pEx->ReportError(MB_ICONEXCLAMATION);
aDlg->m_pFtpConnection = NULL;
pEx->Delete();
}
serverSocket.Send("DOWNLOADFINISH", 17);
break;
case 3:
serverSocket.Send("SERVERWASDOWNLOADING", 20);
//wait until download finish
while(w)
{
for(int i=0; i<10; i++)
if(aDlg->cdpn[i].CompareNoCase("") == 0)
w = FALSE;
else
Sleep(30000);
}
serverSocket.Send("DOWNLOADFINISH", 17);
break;
default:
break;
}
serverSocket.Close();
}
}
aSocket.Close();
serverSocket.Close();
return 0;
}
如果把socket部分独立开来做,在UI起来后,再call socket起来,再做多客户端连接线程?貌似和上面一样,换汤不换药结了,结了。