关于用异步SOCKET传输文件,谁能帮我解答 用异步,SOCKET,从服务器端向客户端传送文件谁能给个方法 该怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int CDataSocket::Receive() { int nRead = 0; if (m_nStatus == XFERMODE_RECEIVE) { if (m_File.m_hFile == NULL) return 0; byte data[PACKET_SIZE]; nRead = CAsyncSocket::Receive(data, PACKET_SIZE); switch(nRead) { case 0: { m_File.Close(); m_File.m_hFile = NULL; Close(); // tell the client the transfer is complete. m_pConnectSocket->SendResponse("226 Transfer complete 4"); // destroy this socket AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0); // upload succesfull ((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADSUCCEEDED); ProcessFiles(); break; } case SOCKET_ERROR: { if (GetLastError() != WSAEWOULDBLOCK) { m_File.Close(); m_File.m_hFile = NULL; Close(); m_pConnectSocket->SendResponse("426 Connection closed; transfer aborted. SOCKET_ERROR"); // destroy this socket AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0); // upload failed ((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED); } break; } default: { ((CConnectThread *)AfxGetThread())->IncReceivedBytes(nRead); TRY { m_File.Write(data, nRead); } CATCH_ALL(e) { m_File.Close(); m_File.m_hFile = NULL; Close(); m_pConnectSocket->SendResponse("450 can't access file."); // destroy this socket AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0); // upload failed ((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED); ProcessFiles(); return 0; } END_CATCH_ALL; break; } } } return nRead; } void CDataSocket::OnReceive(int nErrorCode) { CAsyncSocket::OnReceive(nErrorCode); Receive(); } void CDataSocket::OnAccept(int nErrorCode) { CAsyncSocket socky; Accept(socky); SOCKET socket = socky.Detach(); Close(); Attach(socket); m_bConnected = TRUE; m_pConnectSocket->SendResponse("150 Connection accepted"); CAsyncSocket::OnAccept(nErrorCode); m_bPassiveMode = TRUE; //m_bPassiveMode = FALS } void CDataSocket::OnConnect(int nErrorCode) { if (nErrorCode) { m_nStatus = XFERMODE_ERROR; m_pConnectSocket->SendResponse("425 Can't open data connection. 4"); // destroy this socket AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0); } else { switch (m_nTransferType) { case 0: // List Directory m_nStatus = XFERMODE_LIST; m_bConnected = TRUE; // m_nTotalBytesSend = m_strData.GetLength(); // m_nTotalBytesTransfered = 0; OnSend(0); // Send(m_strData, m_strData.GetLength()); break; case 1: // Send File if (PrepareSendFile(m_strData)) { m_nStatus = XFERMODE_SEND; m_bConnected = TRUE; } else { Close(); } break; case 2: // Receive File if (PrepareReceiveFile(m_strData)) { m_nStatus = XFERMODE_RECEIVE; m_bConnected = TRUE; } else { Close(); m_pConnectSocket->SendResponse("450 can't access file."); // destroy this socket AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0); // upload failed ((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED); } break; } } CAsyncSocket::OnConnect(nErrorCode); } 我是这样做的协议 udp,服务器端ip固定服务器端先绑定套接字,然后注册网络读取事件,之后接受客户端发送来的任意内容,通过recvfrom函数的参数得到客户端的ip地址,和端口。然后在相应的事件消息里发送指定的文件给客户端。客户端注册网络读取事件,然后给服务器端发送任意内容,之后在消息相应事件里接受发送过来的文件。运行时先相应客户端。这样做有什么问题么?为什么我实现不了。接受数据失败? 关于我设置的两个读取事件,都设置为FD_READ可以么 传输文件怎么用UDP?传输文件要求可靠性高,如果你需要做好点的,我可以给你弄个高性能的服务器,ICOP完成端口形式的。1个小时以上的工作量,进行收费服务。 无非就是socket编程。建议看一下《Windows网络编程》或多上www.codeproject.com/internet看。用UDP传输文件的话,关键是需要处理选择包与重传。 消息循环 书无止境 帮看看 关于在格网地形中绘制非规则地形 __beginthread创建的线程如何强制终止? 实现了IDispatch接口的组件和ActiveX控件用起来有什么不同呢?我觉得一样可以用在Web页面上,为什么ActiveX控件还要多实现那么多各种各样 怎样使用VC访问unix下的sas数据仓库? 如何让CDialogBar能够动态改变大小?谢谢! 有关进程空间的问题? 简单 派生类构造函数自动调用基类的构造函数,这个程序的结果不对,不只为何? VC是否支持UDP类?是不是UDPClient?在那个头文件里面定义的?
{
int nRead = 0;
if (m_nStatus == XFERMODE_RECEIVE)
{
if (m_File.m_hFile == NULL)
return 0;
byte data[PACKET_SIZE];
nRead = CAsyncSocket::Receive(data, PACKET_SIZE);
switch(nRead)
{
case 0:
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
// tell the client the transfer is complete.
m_pConnectSocket->SendResponse("226 Transfer complete 4");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload succesfull
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADSUCCEEDED);
ProcessFiles();
break;
}
case SOCKET_ERROR:
{
if (GetLastError() != WSAEWOULDBLOCK)
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
m_pConnectSocket->SendResponse("426 Connection closed; transfer aborted. SOCKET_ERROR");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload failed
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);
}
break;
}
default:
{
((CConnectThread *)AfxGetThread())->IncReceivedBytes(nRead);
TRY
{
m_File.Write(data, nRead);
}
CATCH_ALL(e)
{
m_File.Close();
m_File.m_hFile = NULL;
Close();
m_pConnectSocket->SendResponse("450 can't access file.");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload failed
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);
ProcessFiles();
return 0;
}
END_CATCH_ALL;
break;
}
}
}
return nRead;
}
void CDataSocket::OnReceive(int nErrorCode)
{
CAsyncSocket::OnReceive(nErrorCode);
Receive();
}
void CDataSocket::OnAccept(int nErrorCode)
{
CAsyncSocket socky;
Accept(socky);
SOCKET socket = socky.Detach();
Close();
Attach(socket);
m_bConnected = TRUE;
m_pConnectSocket->SendResponse("150 Connection accepted");
CAsyncSocket::OnAccept(nErrorCode);
m_bPassiveMode = TRUE;
//m_bPassiveMode = FALS
}
void CDataSocket::OnConnect(int nErrorCode)
{
if (nErrorCode)
{
m_nStatus = XFERMODE_ERROR;
m_pConnectSocket->SendResponse("425 Can't open data connection. 4");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
}
else
{
switch (m_nTransferType)
{
case 0: // List Directory
m_nStatus = XFERMODE_LIST;
m_bConnected = TRUE;
// m_nTotalBytesSend = m_strData.GetLength();
// m_nTotalBytesTransfered = 0;
OnSend(0);
// Send(m_strData, m_strData.GetLength());
break;
case 1: // Send File
if (PrepareSendFile(m_strData))
{
m_nStatus = XFERMODE_SEND;
m_bConnected = TRUE;
}
else
{
Close();
}
break;
case 2: // Receive File
if (PrepareReceiveFile(m_strData))
{
m_nStatus = XFERMODE_RECEIVE;
m_bConnected = TRUE;
}
else
{
Close();
m_pConnectSocket->SendResponse("450 can't access file.");
// destroy this socket
AfxGetThread()->PostThreadMessage(WM_THREADMSG, 0, 0);
// upload failed
((CConnectThread *)AfxGetThread())->UpdateStatistic(FTPSTAT_UPLOADFAILED);
}
break;
}
}
CAsyncSocket::OnConnect(nErrorCode);
}
协议 udp,服务器端ip固定服务器端先绑定套接字,然后注册网络读取事件,之后接受客户端发送来的任意内容,通过recvfrom函数的参数得到客户端的ip地址,和端口。然后在相应的事件消息里发送指定的文件给客户端。
客户端注册网络读取事件,然后给服务器端发送任意内容,之后在消息相应事件里接受发送过来的文件。
运行时先相应客户端。这样做有什么问题么?为什么我实现不了。接受数据失败?
用UDP传输文件的话,关键是需要处理选择包与重传。