本软件使用MFC采用面向对象的方法实现了基于Socket的文件传输。这是原来研究生课程的结课作业,实现了Socket的发送和接收,以及读取ini配置文件等操作。使用了CSocket类

以下是当时结课作业 的正文:

一.软件特点如下:

1.      采用了多线程的方法,文件传输时使用AfxBeginThread()开启新线程

void CClientsockDlg::OnBnClickedSend()

{

pThreadSend = AfxBeginThread(Thread_Send,this);/

}

文件的发送和接收都开起了新线程

UINTThread_Send(LPVOID lpParam)

{

代码略…

}

2.      支持从配置文件configuration.ini中获取服务器参数

采用GetPrivateProfileString()和GetPrivateProfileInt()分别获取位于ServerConfiguration.ini文件中的String类型的IP和int类型的port

CString IP;

int port;

GetPrivateProfileString

(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(10),10,L".\\configuration.ini");

port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

3.      采用了面向对象的设计方式,功能之间按模块划分

MFC本身具有良好的面向对象的特性,本程序严格按照MFC框架结构编写代码,每个按钮对应一个功能函数,降低了代码之间的耦合性,有利于程序的扩展和复用。

void CServersockDlg::OnBnClickedChoose()

void CServersockDlg::OnBnClickedSend()

void CServersockDlg::OnBnClickedRecvdata()

void CServersockDlg::OnBnClickedAbout()

void CServersockDlg::OnBnClickedWriteini()

4.      采用了CSocket类,代码相对更简单

CSocket类是MFC框架对socket编程中的winsockAPI的封装,因此通过这个类管理收发数据更加便利。代码也跟那个既简单易懂。

//创建

if(!Clientsock.Socket())

{

CString str;

str.Format(_T("Socket创建失败:%d"),GetLastError());

AfxMessageBox(str);

}

//连接

if(!Clientsock.Connect(IP,port))

{

CString str;

str.Format(_T("Socket连接失败:%d"),GetLastError());

AfxMessageBox(str);

}

else

{

AfxMessageBox(_T("Socket连接成功"));

代码略…

//发送

while(nSize<FindFileData.nFileSizeLow)

{

szBuff = new char[1024];

memset(szBuff,0x00,1024);

nSend =file.Read(szBuff,1024);

Clientsock.Send(szBuff,nSend);//发送数据

nSize += nSend;

}

file.Close();

delete szBuff;

Clientsock.Close();

(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);

AfxMessageBox(_T("文件发送成功"));

dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));

}

return 0;

5.      支持数据在服务器与客户端之间双向传输

本程序不但可以从客户端往服务器端传文件,而且可以从服务器端往客户端传文件。

但是互传文件的方式并不是完全相同的。

服务器端不管是接收文件还是发送文件始终是对绑定的端口进行监听。

//绑定

if(!Serversock.Bind(port))

{

CString str;

str.Format(_T("Socket绑定失败: %d"),GetLastError());

AfxMessageBox(str);

}

//监听

if(!Serversock.Listen(10))

{

CString str;

str.Format(_T("Socket监听失败:%d"),GetLastError());

AfxMessageBox(str);

}

客户端不管是接收文件还是发送文件始终是进行连接。

if(!Clientsock.Connect(IP,port))

{

CString str;

str.Format(_T("Socket连接失ì败:%d"),GetLastError());

AfxMessageBox(str);

}

else

{

略…

6.      完全图形化操作界面

二.软件使用说明

客户端主界面如图所示:

u 单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。

u 单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,发送文件。注意:服务器端应该先单击了“接受客户端数据”,否则发送失败。

u 单击“接收”也会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,接收文件。注意:服务器端应该先选择了向客户端发送的文件,并单击了“发送”,否则接受失败。

u 单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。

u 单击“关于”可以了解到软件相关信息。

u 代码注释里有更详细的说明

服务器端主界面如图所示

u 单击“接受客户端数据”,开始监听客户端的链接。

u  单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。

u  单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(port),并监听对应端口,准备发送文件。注意:客户端选择“接收”以后才能发送成功。

u  单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。但是服务器的IP是不可以修改的,它是在程序开始运行时从服务器所在机器的网卡上获取的。

u  单击“关于”可以了解到软件相关信息。

u  代码注释里有更详细的说明

代码下载地址:http://download.csdn.net/detail/leixiaohua1020/6320417

在此附上客户端使用CSocket发起连接的代码

//----------------------------发送文件的线程------------------------------
UINT Thread_Send(LPVOID lpParam)
{CClientsockDlg *dlg=(CClientsockDlg *)lpParam;(dlg->GetDlgItem(IDC_SEND))->EnableWindow(FALSE);CSocket Clientsock; //definition socket.if(!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);}CString IP;int port;GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\\configuration.ini");port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");//创建if(!Clientsock.Socket()){CString str;str.Format(_T("Socket创建失败: %d"),GetLastError());AfxMessageBox(str);}//连接
//  if(!Clientsock.Connect(_T("127.0.0.1"),8088))if(!Clientsock.Connect(IP,port)){CString str;str.Format(_T("Socket连接失败: %d"),GetLastError());AfxMessageBox(str);}else{AfxMessageBox(_T("Socket连接成功"));WIN32_FIND_DATA FindFileData;CString strPathName; //定义用来保存发送文件路径的CString对象dlg->GetDlgItemTextW(IDC_FILEPATHNAME,strPathName);FindClose(FindFirstFile(strPathName,&FindFileData));Clientsock.Send(&FindFileData,sizeof(WIN32_FIND_DATA));CFile file;if(!file.Open(strPathName,CFile::modeRead|CFile::typeBinary)){AfxMessageBox(_T("文件不存在"));return 1;}UINT nSize = 0;UINT nSend = 0;char *szBuff=NULL;//发送while(nSize<FindFileData.nFileSizeLow){szBuff = new char[1024];memset(szBuff,0x00,1024);nSend = file.Read(szBuff,1024);Clientsock.Send(szBuff,nSend);//发送数据nSize += nSend;}file.Close();delete szBuff;Clientsock.Close();(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);AfxMessageBox(_T("文件发送成功"));dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));}return 0;
}

以及服务器端使用CSocket监听的代码:

//----------------------------监听文件的线程------------------------------
UINT Thread_Func(LPVOID lpParam)  //接收文件的线程函数
{CServersockDlg *dlg = (CServersockDlg *)lpParam; //获取对话框指针(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(FALSE);if(!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);}CString IP;int port;GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\\configuration.ini");port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");char errBuf[100]={0};// 临时缓存SYSTEMTIME t; //系统时间结构 CFile logErrorfile;if(!logErrorfile.Open(_T("logErrorfile.txt"),CFile::modeCreate|CFile::modeReadWrite)){return 1;}CSocket Serversock;CSocket Clientsock;//创建if(!Serversock.Socket()){CString str;str.Format(_T("Socket创建失败: %d"),GetLastError());AfxMessageBox(str);}BOOL bOptVal = TRUE;int bOptLen = sizeof(BOOL);Serversock.SetSockOpt(SO_REUSEADDR,(void *)&bOptVal,bOptLen,SOL_SOCKET);//绑定if(!Serversock.Bind(port)){CString str;str.Format(_T("Socket绑定失败: %d"),GetLastError());AfxMessageBox(str);}//监听 if(!Serversock.Listen(10)){CString str;str.Format(_T("Socket监听失败: %d"),GetLastError());AfxMessageBox(str);}GetLocalTime(&t);sprintf_s(errBuf,"服务器已经启动...正在等待接收文件...\r\n时间:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);int len = strlen(errBuf);logErrorfile.Write(errBuf,len);AfxMessageBox(_T("启动成功等待接收文件"));while(1){//AfxMessageBox(_T("服务器启动成功..."));if(!Serversock.Accept(Clientsock)) //等待接收 {continue;}else{WIN32_FIND_DATA FileInfo;Clientsock.Receive(&FileInfo,sizeof(WIN32_FIND_DATA));CFile file;file.Open(FileInfo.cFileName,CFile::modeCreate|CFile::modeWrite);//AfxMessageBox(FileInfo.cFileName);int length = sizeof(FileInfo.cFileName);logErrorfile.Write(FileInfo.cFileName,length);//Receive文件的数据UINT nSize = 0;UINT nData = 0;char *szBuff=NULL;while(nSize<FileInfo.nFileSizeLow){szBuff = new char[1024];memset(szBuff,0x00,1024);nData=Clientsock.Receive(szBuff,1024);file.Write(szBuff,nData);nSize+=nData;}delete szBuff;Serversock.Close();Clientsock.Close();file.Close();(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);sprintf_s(errBuf,"文件接收成功...\r\n时间:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);int len = strlen(errBuf);logErrorfile.Write(errBuf,len);//AfxMessageBox(_T("文件接收成功..."));break;}}return 0;
}

基于Socket的文件传输(使用CSocket类)相关推荐

  1. Linux平台基于socket的文件传输服务器和客户端

    Linux平台基于socket的文件传输服务器和客户端 目录 前言 一.服务器程序结构 二.客户程序结构 三.代码 1.服务器主程序video_serv_fork.c 2.服务器子程序video_tr ...

  2. 基于python的文件传输程序_GitHub - orange0cat/python-ft: 基于socket的文件传输程序,能传输整个文件夹...

    FileTransporter 这是一个基于socket(TCP)的文件(夹)传输程序 预览效果 0.环境搭建 在virtualenv环境下,cd 进入 requirements.txt所在目录,执行 ...

  3. Java 基于TCP的socket实现文件传输

    Java 基于TCP的socket实现文件传输 基于TCP的socket结合java的io流 实现客户端与服务器之间的文件传输 Socket 套接字(socket)是一个抽象层,应用程序可以通过它发送 ...

  4. Socket实现文件传输

    Socket实现文件传输 1.客户端 通过new Socket("ip",port)连接服务端 创建文件输入流读取文件 创建返回套接字的输出流 写入文章名称,长度等属性 读取.写入 ...

  5. scp 命令 路径_基于SSH的文件传输:scp命令

    日常开发中,经常需要在服务器和本地之间进行文件传输.这里来介绍一种基于SSH的文件传输方法--scp命令 命令格式 scp(secure copy,remote file copy program), ...

  6. 文件传输_python socket实现文件传输(防粘包)

    1.文件传输的要点: 采用iterator(迭代器对象)迭代读取,提高读取以及存取效率: 通过for line in file_handles逐行conn.send(): 2.socket粘包问题: ...

  7. python文件传输socket_树莓派采用socket方式文件传输(python)

    两个树莓派,在同一个局域网内,传输文件,采用socket方式. client端代码: import socket import os import hashlib client = socket.so ...

  8. QT中级(6)基于QT的文件传输工具(2)

    QT中级(6)基于QT的文件传输工具(2) 本文实现第一步 1 新增功能 2 运行效果 3 实现思路 4 源代码 实现这个文件传输工具大概需要那几步? 实现多线程对文件的读写 实现TCP客户端和服务端 ...

  9. Linux 利用socket实现文件传输

    文章目录 一.要求 二.实现提示: 三.程序 四.现象 一.要求   利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件 二.实现提示: client.c cli ...

最新文章

  1. [导入]郁闷`````[原]
  2. 藏在1.85亿人体内的隐形致癌病毒,有人确诊即是晚期
  3. JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
  4. Android中RatingBar的自定义效果
  5. leetcode 718. Maximum Length of Repeated Subarray | 718. 最长重复子数组(动态规划)
  6. android自定义task,Android Gradle 自定义Task 详解
  7. 接口测试基础知识学习
  8. 安装logstash-7.9.3和filebeat-7.9.3
  9. 游戏辅助制作技术分析
  10. 高性能网络编程(二):上一个10年,著名的C10K并发连接问题
  11. lj2400恢复出厂_联想LJ2400加粉后如何清零
  12. 坦克世界怎么显示服务器准心,坦克世界8.0环境设置详细教程
  13. hdu1814 暴力
  14. 快速生成快递柜唯一取件码
  15. 用U盘启动WinPE全新安装原版XP系统--有关pe装系统
  16. 第八篇,字符数组和字符指针详细讲解。
  17. 详细盘点清华姚班 智班,北大 浙大图灵班等多所高校AI专业实力!
  18. vista 系统问题
  19. ROS和S7-1200 PLC
  20. android移植 开发板,iTOP-4412开发板-Android5.1- 移植教程

热门文章

  1. HDU2050 折线分割平面【切割平面】
  2. JSK-369 字符逆序【入门】
  3. JSK-24 函数规律【基础】
  4. Bailian3659 判断是否为C语言的合法标识符【文本处理】
  5. CCF NOI1036 进制转换
  6. HDU2032 杨辉三角【入门+趣味程序】
  7. 亲和数(220/284)
  8. 【笔试/面试】—— Linux 查看 cpu 和内存使用情况
  9. 工具的使用——vs2013(三)
  10. axi dma 寄存器配置_「STM32」DMA采集单通道,简单数据分析