基于mfc的socket编程怎么进行文件传输
1.采用了多线程的方法,文件传输时使用AfxBeginThread()开启新线程 void CClientsockDlg::OnBnClickedSend(){pThreadSend = AfxBeginThread(Thread_Send,this);/}文件的发送和接收都开起了新线程UINTThread_Send(LPVOID lpParam){代码略…}2.支持从配置文件configuration.ini中获取服务器参数采用GetPrivateProfileString()和GetPrivateProfileInt()分别获取位于ServerConfiguration.ini文件中的String类型的IP和int类型的portCString 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(nSizeGetDlgItem(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.完全图形化操作界面二.软件使用说明客户端主界面如图所示:单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,发送文件。注意:服务器端应该先单击了“接受客户端数据”,否则发送失败。单击“接收”也会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,接收文件。注意:服务器端应该先选择了向客户端发送的文件,并单击了“发送”,否则接受失败。单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。单击“关于”可以了解到软件相关信息。代码注释里有更详细的说明服务器端主界面如图所示u 单击“接受客户端数据”,开始监听客户端的链接。u单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。u单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(port),并监听对应端口,准备发送文件。注意:客户端选择“接收”以后才能发送成功。u单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。但是服务器的IP是不可以修改的,它是在程序开始运行时从服务器所在机器的网卡上获取的。u单击“关于”可以了解到软件相关信息。u代码注释里有更详细的说明代码下载地址:http://download.csdn.net/detail/leixiaohua1020/6320417在此附上客户端使用CSocket发起连接的代码[cpp] view plain copy//----------------------------发送文件的线程------------------------------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(nSizeGetDlgItem(IDC_SEND))->EnableWindow(TRUE);AfxMessageBox(_T("文件发送成功"));dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));}return 0;}以及服务器端使用CSocket监听的代码:[cpp] view plain copy//----------------------------监听文件的线程------------------------------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,"服务器已经启动...正在等待接收文件...rn时间:%d年%d月%d日 %2d:%2d:%2d rn",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(nSizeGetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);sprintf_s(errBuf,"文件接收成功...rn时间:%d年%d月%d日 %2d:%2d:%2d rn",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; }
首先创建一个MFC项目,修改名称以及存放路径。 项目配置,在向导过程中选择“基于对话框”模式,并选择“windows”套接字。设计服务器界面,控件有:4个静态文本(Static Text),最后一个用于指示用户连接个数;一个按钮(Button),用于打开或关闭服务器;2个编辑框(Edit Control),一个用于输入端口号,另一个只读的用于显示事件日志。修改各个控件的属性,注意编辑框2还要把Multiline和Vertical Scroll属性选为true,以实现多行显示并自带滚动条。1、 给控件添加变量和事件处理函数,这个通过类向导就可以完成,变量如上表所示,事件只有“按钮按下”一个,双击按钮自动生成函数,后面添加相关代码即可。2、 在类视图中添加一个新类CServerSocket,派生于CSocket类,对该类进行类向导添加三个函数: OnAccept()、OnClose()、OnReceive()

请问我怎样用socket发送一个文件?
我想做一个程序,一个客户端,一个服务器段,两个通过socket发送和传递文件,我不知道能不能用sendstream或其他实现,我找不到例程,望赐教,定给分!定给分!定给分!定给分!定给分!
只要把文件流分块便不会有问题,不能一次发送过大的数据我分为8K,no problem
10K左右吧mybuffer:array[0..10000]of byte;//设置接受缓冲区这就是每次发送流的大小

socket编程:文件夹的传输
没有别的方法了 传输文件夹只能先遍历文件夹,获取所有文件夹和文件信息 然后在本地建立文件夹,并逐个写文件

iOS 中设备之间 socket 传文件应该怎么实现
socket是比较底层的通讯方式,只是建立了一个连接通道,具体上面传输什么样的数据,按照什么格式传输,需要你自己定义。换句话说,你需要自己定义一个文件传输协议。例如,要定义数据包的大小,要定义每个数据包的格式,定义纠错机制,网络中断后如何恢复等等。大文件要拆分成数据包来传输,接收方要把收到的数据包再组装起来。文件名这些信息也做为原始数据的一部分通过数据包传过去,只不过跟文件内容的数据包类型不一样而已。 但是,实现这样一个传输协议是比较麻烦和容易出错的,象传文件这种逻辑比较简单的操作一般没必要在socket层直接操作。iOS提供了CFStream接口,适合文件这种数据流的传输。iOS本身的FTP和HTTP协议栈的实现也是使用CFStream API,而不是直接操作socket的。
sock_stream 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。
sock_dgram 是无保障的面向消息的socket , 主要用于在网络上发广播信息。
SOCK_STREAM是基于TCP的,数据传输比较有保障。SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播
SOCK_STREAM 是数据流,一般是tcp/ip协议的编程,SOCK_DGRAM分是数据抱,是udp协议网络编程
解释一下:
关于UDP
1、UDP协议适用端口分辨运行在同一台设备上的多个应用程序,UDP有不提供数据报分组、组装和不能对数据包进行排序的缺点。
也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
2、在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。
3、但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
关于TCP
1、TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。
2、TCP特性:
(1)面向连接的传输; (2)端到端的通信; (3)高可靠性,确保传输数据的正确性,不出现丢失或乱序; (4)全双工方式传输; (5)采用字节流方式,即以字节为单位传输字节序列; (6)紧急数据传送功能。
所以如果你需要传输的数据是准确的,建议采用TCP,也就是sock_stream
如果你传输的是视频音频等数据,丢几个包也无所谓的,可以采用UDP,也就是sock_dgram

用C语言实现socket文件传输?
服务端代码: #include #include #include #include #include #include #include #include #define MYPORT 3490 /*定义用户连接端口*/#define BACKLOG 10 /*多少等待连接控制*/main(){int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd*/struct sockaddr_in my_addr; /* my address information */struct sockaddr_in their_addr; /* connector's address information */int sin_size;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}my_addr.sin_family = AF_INET; /* host byte order */my_addr.sin_port = htons(MYPORT); /* short, network byte order */my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(structsockaddr))== -1) {perror("bind");exit(1);}if (listen(sockfd, BACKLOG) == -1) {perror("listen");exit(1);}while(1) { /* main accept() loop */sin_size = sizeof(struct sockaddr_in);if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {perror("accept");continue;}printf("server: got connection from %sn", inet_ntoa(their_addr.sin_addr));if (!fork()) { /* this is the child process */if (send(new_fd, "Hello, world!n", 14, 0) == -1)perror("send");close(new_fd);exit(0);}close(new_fd); /* parent doesn't need this */while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */}}客户代码:#include #include #include #include #include #include #include #include #define PORT 3490 /* 客户机连接远程主机的端口 */#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */int main(int argc, char *argv[]){int sockfd, numbytes;char buf[MAXDATASIZE];struct hostent *he;struct sockaddr_in their_addr; /* connector's address information */if (argc != 2) {fprintf(stderr,"usage: client hostnamen");exit(1);}if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */herror("gethostbyname");exit(1);}if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);}their_addr.sin_family = AF_INET; /* host byte order */their_addr.sin_port = htons(PORT); /* short, network byte order */their_addr.sin_addr = *((struct in_addr *)he->h_addr);bzero(&(their_addr.sin_zero),; /* zero the rest of the struct */if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(structsockaddr)) == -1) {perror("connect");exit(1);}if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {perror("recv");exit(1);}buf[numbytes] = ' ';printf("Received: %s",buf);close(sockfd);return 0; }
socket + FILE灰常简单~! SOCKET 例子多如牛毛,FILE文件操作更是随处可见~!

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/79100.html。