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

📄 vc.txt

📁 vc编写的代理服务器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
::SetEvent(pPar- >User_SvrOK); 
return -1;
}


#ifdef _DEBUG
printf("Client connecting to: %s\n",hp- >h_name);
#endif
if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server))
== SOCKET_ERROR) {
fprintf(stderr,"connect() failed: %d\n",WSAGetLastError());
pPar- >pPair- >IsProxy_ServerClosed=TRUE; 
::SetEvent(pPar- >User_SvrOK); 
return -1;
}
pPar- >pPair- >proxy_server=conn_socket;
pPar- >pPair- >IsProxy_ServerClosed=FALSE;
::SetEvent(pPar- >User_SvrOK);
// cook up a string to send
while(!pPar- >pPair- >IsProxy_ServerClosed &&!pPar- >pPair->IsUser_ProxyClosed)
{
retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
if (retval == SOCKET_ERROR ) {
fprintf(stderr,"recv() failed: error %d\n",WSAGetLastError());
closesocket(conn_socket);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
break;
}
Len=retval;
if (retval == 0) {
printf("Server closed connection\n");
closesocket(conn_socket);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
break;
}

retval = send(pPar- >pPair- >user_proxy,Buffer,Len,0);
if (retval == SOCKET_ERROR) {
fprintf(stderr,"send() failed: error %d\n",WSAGetLastError());
closesocket(pPar- >pPair- >user_proxy);
pPar- >pPair- >IsUser_ProxyClosed=TRUE;
break; 
}
#ifdef _DEBUG 
Buffer[Len]=0; 
printf("Received %d bytes, data [%s] from server\n",retval,Buffer);
#endif
}
if(pPar- >pPair- >IsProxy_ServerClosed==FALSE)
{
closesocket(pPar- >pPair- >proxy_server);
pPar- >pPair- >IsProxy_ServerClosed=TRUE;
}
if(pPar- >pPair- >IsUser_ProxyClosed==FALSE)
{closesocket(pPar- >pPair- >user_proxy);
pPar- >pPair- >IsUser_ProxyClosed=TRUE;
}
return 1;
}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// 初始化SOCKET
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// 错误处理
cerr < < _T("Fatal Error: MFC initialization failed") < < endl;
nRetCode = 1;
}
else
{
// 主程序开始.
StartServer(); 
while(1) 
if(getchar()=='q') break;
CloseServer();
}

return nRetCode;
} 




用VC++5.0编写Ftp客户程序

随着Internet的迅猛发展,网络软件的开发与设计显得越来越重要。最初的网络软
件主要是以UNIX操作系统为软件开发环境的,随着Windows个人操作系统的流行,传统的
编程界面向这一新的软硬件平台转换变得极为迫切。VC++5.0版的MFC封装了的CSocket类
提供了高级的SOCKET支持,为编写因特网环境下基于Windows平台的C/S程序提供了极大
的方便。本文通过利用CSocket类编写一个FTP客户程序为例介绍了其使用方法,向你揭
开网络编程的秘密。

WINSOCK以动态链接库的形式向程序员提供了一个功能强大的函数集,通过对这个函
数集的调用,应用程序可以完成其特定的任务。然而缺点是程序较为繁琐。为了解决这
一问题,Microsoft对其推出的Visual C++系列的基本类库(MFC)做了逐步的完善。尤其
是新近发行的VC++5.0版,封装了许多与网络程序设计相关的类。CSocket就是其中之一。

CSocket类(父类为CAsyncSocket)提供了一个高级的SOCKET支持,完成对低层函数的
操作,大大降低了编程难度。这里,以Windows 95为开发环境,采用Visual C++5.0编写
一个Ftp客户程序,来说明如何深入有效地利用CSocket类进行网络软件的开发。考虑到
C/S模式下应建立一个Ftp服务器的问题,所以选择Windows 95的4.00.950B版,因为这个
版本含有个人Web服务器,提供了HTTP及FTP服务。

首先,建立一个SDI(单文档界面)应用程序的基本框架。这一步比较简单,在VC++5.0
中,MFC AppWizard通过创建一个新的项目(Project)而被激活,选择File菜单中的New选
项,选取Project,输入文件名为SuperFTP,选择OK。随后的步骤为VC++自动创建过程,
可以参见相关资料,不再详述。最后生成以下几个主要类:
CMainFrame,
CSuperFTPApp,
CSuperFTPDoc,
CSuperFTPView,
CAboutDlg。
其次,建立几个新类,如下表:
有关Ftp协议请参考相关资料,这是正确开发Ftp客户程序的重要前提。
第三步,具体程序的编制。由于整个程序比较长,下面给出主要部分的核心代码并附注释。
1.MainFrm.cpp:
……
CMainFrame::CMainFrame()
//初始化指针
m_ctrlconn=NULL;
m_dataconn=NULL;
m_recvconn=NULL;
//选择菜单项“快速连接”
void CMainFrame::OnQuickconnect()
if(!Makeconn())
MessageBox(“FTP控制链路建立失败!”,“提示”,MB_ICONWARNING);
if(!MakeRemoteDir())
MessageBox(“FTP数据链路建立失败!”,“提示”,MB_ICONWARNING);
//建立控制链路
BOOL CMainFrame::Makeconn()
……
Quickconn dlg;
//输入服务器名,用户名,口令
if (dlg.DoModal()==IDOK)
fservername=dlg.m_servername;
fusername=dlg.m_username;
fpassword=dlg.m_password;
m_ctrlconn=new ctrlsocket();
//建立一个SOCKET
If(!m_ctrlconn->Create(0,SOCK_STREAM,NULL)
delete m_ctrlconn;
m_ctrlconn=NULL;
MessageBox(“Socket()建立失败!”,“提示”,MB_ICONWARNING);
return FALSE;
//申请网络事件通知
If(!m_ctrlconn->AsyncSelect(FD_READ|FD_WRITE|FD_ACCEPT|FD_CONNECT|FD_CLOSE))
MessageBox(“AsyncSelect()错误!”,“提示”,MB_ICNWARNING);
return FALSE;
BeginWaitCursor();
//向由fservername指定的主机发出连接请求
if(!m_ctrlconn->Connect(fservername,IPPORT_FTP))
delete m_ctrlconn;
m_ctrlconn=NULL;
MessageBox(远端服务器连接失败!”,“提示”,MB_ICONWARNING);
return FALSE;
EndWaitCursor();
……
return TRUE;
这里,选择了菜单的“快速连接”项后,执行结果如下图:
如果选择了“匿名”登录,应用程序则自动将用户姓名和口
令字填充为:anonymous,guest@unknown
BOOL CMainFrame::MakeRemoteDir()
if(m_ctrlconn==NULL)
(“请连接到服务器!”,“提示”,MB_iconwarwing);
retrurn FALSE;
if(!MakeDataListen())
MessageBox(“数据链路建立失败!”,“提示”,MB_ICONWARNING);
return FALSE;
……
return TRUE;
//处理来自远端服务器的响应
BOOL CMainFrame::Processftp()
………
//建立数据连接“监听”函数
BOOL CMainFrame::MakeDataListen()
……
m_dataconn=new Listensocket();
/* 建立一个SOCKET,并与本地主机地址捆绑。作为一个例子,直接插入了本机的IP
地址“90.0.0.8”,而在实际应用中应首先通过相应的函数调用取得本地主机地址。
注意:如果不采用VC++的CSocket类而用其它的方法,需在建立SOCKET之后,调用
bind()函数来进行与本地主机地址的捆绑。*/
if(!m_dataconn->Create(0,SOCK_STREAM,“90.0.0.8”))
delete m_dataconn;
m_dataconn=NULL;MessageBox(“Socket()建立失败!”,“提示”,MB_ICONWARNING);
return FALSE;
//申请网络事件通知
if(!m_dataconn->AsyncSelect(FD_ACCEPT))
delete m_dataconn;
m_dataconn=NULL;
MessageBox(“AsyncSelect()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
……
if(!m_dataconn->Listen(5))
MessageBox(“listen()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
……
//接受数据连接请求的函数
BOOL CMainFrame::AcceptDataConn()
int num,nRet;
SOCKADDR_IN RemoteDataAddr;
num=sizeof(SOCKADDR_IN);
if(m_recvconn==NULL)
m_recvconn=new Datasocket();
if(!m_dataconn->Accept(*m_recvconn,(LPSOCKADDR)&RemoteDataAddr,(int FAR*)&num))
MessageBox(“accept()错误!”,“提示”,MB_ICONWARWING);
return FALSE;
……
m_dataconn->Close();
//申请网络事件通知
if(!m_recvconn->AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE)
MessageBox(“Asyncselect()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
return TRUE;
//数据接受函数,接受来自远端服务器的数据
int CMainFrame::RecvData()
……
int nRet=m_recvconn->Receive(…);
if (nRet>0)
else
……
2.ctrlsocket.cpp
……
void ctrlsocket::OnReceive(int nErrorCode)
//处理网络事件FD_READ
CSocket::OnReceive(nErrorCode);
((CmainFrame *)(AfxGetApp()->m_pMainWnd))->Processftp();
3.Listensocket.cpp
……
void Listensocket::OnAccept(int nErrorCode)
//处理网络事件FD_ACCEPT
CSocket::OnAccept(nErrorCode);
((CmainFrame*)AfxGetApp()->m_pMainWnd))->AcceptDataConn();
4.Datasocket.cpp
……
Datasocket::OnReceive(int nErrorCode)
//处理网络事件FD_READ
CAsyncSocket::OnReceive(nErrorCode);
((CMainFrame*)(AfxGetApp()->m_pMainWnd))->RecvData();
void Datasocket::OnSend(int nErrorCode)
//处理网络事件FD_WRITE
CAsyncSocket::OnSend(nErrorCode);
((CMainFrame*)(AfxGetApp()->m_pMainWnd))->SendData();

程序执行时左下窗口为本地系统,右下窗口为远端系统。通过激活相关的菜单项,
就可以对远端主机的文件系统进行下载操作。当然,如果Ftp服务器允许上载,你也可
以将自己的文件传送到远端主机。 




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -