// CTcpServer
// XSoft
// Author: alone
// Contact: lovelypengpeng@eyou.com or hongxing777@msn.com
// Update Date: 2005.1.17
// Comment: if you find any bugs or have any suggestions please contact me.
// 可以收发网络消息, 同时可接收文件,支持断点续传,支持同时接收多个文件
//
#include "stdafx.h"
#include "TcpServer.h"
#include "SysUtils.h"
#pragma comment(lib, "Ws2_32.lib")
/////////////////////////////////////////////////////////////////////////
// CTcpServer
/////////////////////////////////////////////////////////////////////////
CTcpServer::CTcpServer(void *pNotifyObj)
{
ASSERT(pNotifyObj != NULL);
memset(&m_WSAData, 0, sizeof(WSADATA));
m_pNotifyObj = pNotifyObj;
strcpy(m_szBindIpAddr, "");
m_wPort = DFT_PORT;
m_nSendTimeOut = DFT_SENDTIMEOUT;
m_dwProgressTimeInterval = DFT_PROGRESSTIMEINTERVAL;
m_nAcceptThreadPriority = DFT_ACCEPTTHREADPRIORITY;
m_nSocketRecvThreadPriority = DFT_SOCKETRECVTHREADPRIORITY;
// 初始化事件指针
m_OnAccept = NULL;
m_OnAcceptErr = NULL;
m_OnSocketConnect = NULL;
m_OnSocketClose = NULL;
m_OnOneNetMsg = NULL;
m_OnRecvFileRequest = NULL;
m_OnRecvFileProgress = NULL;
m_OnRecvFileSucc = NULL;
m_OnRecvFileFail = NULL;
StartupSocket(); // 初始化windows socket
RegisterAcceptWndClass(); // 注册用于接收socket连接的窗体类
RegisterRecvWndClass(); // 注册用于接收数据的窗体类
RegisterFileRecverWndClass(); // 注册用于文件接收器的窗体类
m_pAcceptSocket = new CAcceptSocket(this, m_pNotifyObj); // 接收socket连接的socket对象
}
CTcpServer::~CTcpServer(void)
{
StopAccept(); // 停止接收socket连接
CancelAllRecvFile(); // 取消所有的文件接收
CloseAllServerClientSocket(); // 关闭所有的客户端连接
UnregisterClass(STR_RECVHIDEWNDCLASSNAME, AfxGetInstanceHandle());
UnregisterClass(STR_ACCEPTHIDEWNDCLASSNAME, AfxGetInstanceHandle());
UnregisterClass(STR_FILERECVERHIDEWNDCLASSNAME, AfxGetInstanceHandle());
CleanupSocket();
// 关闭并删除接受socket对象
delete m_pAcceptSocket;
m_pAcceptSocket = NULL;
}
// 初始化windows socket
BOOL CTcpServer::StartupSocket(void)
{
int nErrCode = 0;
if(m_WSAData.wVersion == 0)
{
nErrCode = WSAStartup(0x0101, &m_WSAData);
if(nErrCode != 0)
memset(&m_WSAData, 0, sizeof(WSADATA));
}
return (nErrCode == 0);
}
// 清除windows socket
void CTcpServer::CleanupSocket(void)
{
if(m_WSAData.wVersion != 0)
{
WSACleanup();
memset(&m_WSAData, 0, sizeof(WSADATA));
}
}
// 关闭所有的客户端socket连接
void CTcpServer::CloseAllServerClientSocket(void)
{
CServerClientSocket *pServerClientSocket;
while(!m_ServerClientSockets.IsEmpty())
{
pServerClientSocket = m_ServerClientSockets.RemoveHead();
delete pServerClientSocket;
}
}
// 注册用于接收线程连接的窗体类
BOOL CTcpServer::RegisterAcceptWndClass(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.lpfnWndProc = (WNDPROC)(CAcceptSocket::HideWndProc);
wc.hInstance = AfxGetInstanceHandle();
wc.lpszClassName = STR_ACCEPTHIDEWNDCLASSNAME;
return (RegisterClass(&wc) != 0);
}
// 注册用于接收数据的窗体类
BOOL CTcpServer::RegisterRecvWndClass(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.lpfnWndProc = (WNDPROC)(CServerClientSocket::HideWndProc);
wc.hInstance = AfxGetInstanceHandle();
wc.lpszClassName = STR_RECVHIDEWNDCLASSNAME;
return (RegisterClass(&wc) != 0);
}
// 注册用于文件接收器的窗体类
BOOL CTcpServer::RegisterFileRecverWndClass(void)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
wc.lpfnWndProc = (WNDPROC)(CFileRecver::HideWndProc);
wc.hInstance = AfxGetInstanceHandle();
wc.lpszClassName = STR_FILERECVERHIDEWNDCLASSNAME;
return (RegisterClass(&wc) != 0);
}
// 开始接收socket连接
BOOL CTcpServer::StartAccept(void)
{
StopAccept();
m_pAcceptSocket->SetBindIpAddr(m_szBindIpAddr);
m_pAcceptSocket->SetPort(m_wPort);
m_pAcceptSocket->SetAcceptThreadPriority(m_nAcceptThreadPriority);
m_pAcceptSocket->SetOnAccept(m_OnAccept);
m_pAcceptSocket->SetOnAcceptErr(m_OnAcceptErr);
m_pAcceptSocket->SetOnSocketConnect(m_OnSocketConnect);
return m_pAcceptSocket->StartAccept();
}
// 停止接收socket连接
void CTcpServer::StopAccept(void)
{
m_pAcceptSocket->StopAccept();
}
// 添加socket对象
CServerClientSocket *CTcpServer::AddServerClientSocket(SOCKET hSocket)
{
// 创建socket对象
CServerClientSocket *pServerClientSocket = new CServerClientSocket(this, m_pNotifyObj);
pServerClientSocket->SetSocketHandle(hSocket);
pServerClientSocket->SetSendTimeOut(m_nSendTimeOut);
pServerClientSocket->SetProgressTimeInterval(m_dwProgressTimeInterval);
pServerClientSocket->SetSocketRecvThreadPriority(m_nSocketRecvThreadPriority);
pServerClientSocket->SetOnSocketClose(m_OnSocketClose);
pServerClientSocket->SetOnOneNetMsg(m_OnOneNetMsg);
pServerClientSocket->SetOnRecvFileRequest(m_OnRecvFileRequest);
pServerClientSocket->SetOnRecvFileProgress(m_OnRecvFileProgress);
pServerClientSocket->SetOnRecvFileSucc(m_OnRecvFileSucc);
pServerClientSocket->SetOnRecvFileFail(m_OnRecvFileFail);
// 初始化接收socket
if(!pServerClientSocket->InitServerClientSocket())
{
delete pServerClientSocket;
return NULL;
}
// 添加到列表
m_ServerClientSockets.AddTail(pServerClientSocket);
return pServerClientSocket;
}
// 移除客户端socket对象
void CTcpServer::RemoveServerClientSocket(CServerClientSocket *pServerClientSocket)
{
POSITION pos;
pos = m_ServerClientSockets.Find(pServerClientSocket);
if(pos != NULL)
m_ServerClientSockets.RemoveAt(pos);
}
// 取消所有的接收
void CTcpServer::CancelAllRecvFile(void)
{
CServerClientSocket *pServerClientSocket;
POSITION pos;
pos = m_ServerClientSockets.GetHeadPosition();
for(int i = 0; i < m_ServerClientSockets.GetCount(); i++)
{
pServerClientSocket = m_ServerClientSockets.GetNext(pos);
pServerClientSocket->CancelRecvFile();
}
}
// 获取客户端数目
int CTcpServer::GetClientCount(void)
{
return m_ServerClientSockets.GetCount();
}
void CTcpServer::SetBindIpAddr(char *szBindIpAddr)
{
strcpy(m_szBindIpAddr, szBindIpAddr);
}
void CTcpServer::SetPort(WORD wPort)
{
m_wPort = wPort;
}
void CTcpServer::SetSendTimeOut(int nSendTimeOut)
{
m_nSendTimeOut = nSendTimeOut;
}
void CTcpServer::SetProgressTimeInterval(DWORD dwProgressTimeInterval)
{
m_dwProgressTimeInterval = dwProgressTimeInterval;
}
void CTcpServer::SetAcceptThreadPriority(int nPriority)
{
m_nAcceptThreadPriority = nPriority;
}
void CTcpServer::SetSocketRecvThreadPriority(int nPriority)
{
m_nSocketRecvThreadPriority = nPriority;
}
void CTcpServer::SetOnAccept(AcceptFun OnAccept)
{
m_OnAccept = OnAccept;
}
void CTcpServer::SetOnAcceptErr(AcceptErrFun OnAcceptErr)
{
m_OnAcceptErr = OnAcceptErr;
}
void CTcpServer::SetOnSocketConnect(SocketConnectFun OnSocketConnect)
{
m_OnSocketConnect = OnSocketConnect;
}
void CTcpServer::SetOnSocketClose(SocketCloseFun OnSocketClose)
{
m_OnSocketClose = OnSocketClose;
}
void CTcpServer::SetOnOneNetMsg(OneNetMsgFun OnOneNetMsg)
{
m_OnOneNetMsg = OnOneNetMsg;
}
void CTcpServer::SetOnRecvFileRequest(RecvFileRequestFun OnRecvFileRequest)
{
m_OnRecvFileRequest = OnRecvFileRequest;
}
void CTcpServer::SetOnRecvFileProgress(RecvFileProgressFun OnRecvFileProgress)
{
m_OnRecvFileProgress = OnRecvFileProgress;
}
void CTcpServer::SetOnRecvFileSucc(RecvFileSuccFun OnRecvFileSucc)
{
m_OnRecvFileSucc = OnRecvFileSucc;
}
void CTcpServer::SetOnRecvFileFail(RecvFileFailFun OnRecvFileFail)
{
m_OnRecvFileFail = OnRecvFileFail;
}
/////////////////////////////////////////////////////////////////////////
// CAcceptSocket
/////////////////////////////////////////////////////////////////////////
// 隐藏窗体消息处理函数
LRESULT CAcceptSocket::HideWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CAcceptSocket *pAcceptSocket = (CAcceptSocket *)lP
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
完整源代码版本2.2 C/C++实现,包括完整源代码,vc工程文件,保证能够编译通过。 使用阻塞方式的socket,使用多线程,有较高的性能. 在局域网中测试达到极限速度. 支持断点续传. 服务端可同时接收多个文件. 传输文件的同时可以发送网络消息. 用户界面与后台线程交互 如有问题请与我联系: hongxing777@gmail.com
资源推荐
资源详情
资源评论
收起资源包目录
socket-file-transfer.zip (39个子文件)
socket-file-transfer
Send
StdAfx.h 1KB
Thread.h 502B
Release
Send.exe 220KB
res
Send.rc2 396B
Send.ico 1KB
TcpClient.cpp 26KB
Send.dsp 4KB
SendDlg.h 2KB
Send.sln 897B
Thread.cpp 714B
Resource.h 1KB
Send.h 1KB
Send.cpp 2KB
Send.dsw 533B
TcpClient.h 8KB
Send.vcproj 7KB
SendDlg.cpp 7KB
StdAfx.cpp 206B
Send.rc 6KB
Send.suo 10KB
Recv
StdAfx.h 1KB
Thread.h 502B
Release
Recv.exe 224KB
Recv.rc 5KB
res
Recv.ico 1KB
Recv.rc2 396B
SysUtils.cpp 7KB
Recv.h 1KB
Recv.cpp 2KB
Thread.cpp 714B
RecvDlg.cpp 8KB
Resource.h 1KB
Recv.dsp 4KB
RecvDlg.h 2KB
StdAfx.cpp 206B
TcpServer.cpp 34KB
TcpServer.h 13KB
SysUtils.h 828B
Recv.dsw 533B
共 39 条
- 1
flyingfly
- 粉丝: 9
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页