网络编程中粘包的处理方法
2014-05-16 14:07
225 查看
写在前面的话:因为自己是才接触网络编程,在工作中第一次遇到粘包问题,我还不知道它是叫粘包问题,所以被整的晕头转向,百思不得其解,自己的代码到底哪里出了问题,最后只能单步调试程序才发现接收方接收到的数据并不一定是按自己设想那样,一次接收整个数据包,当时就想到用文件长度来判断是否接收完文件,之后读了UNP才知道是粘包问题。记录以下当时自己的处理方法。
面对网络编程中的发送文件时的粘包问题,我的处理方法是在要发送文件前,首先发送文件的长度,获取的文件长度是UlongLong类型的整数,发送
时需要转换为字符串,有两种处理方法,第一种是使用C++中的流,第二种是使用系统提供的一个函数,当然第二个是比较方便,但是在知道有第二个
方法前,只能折中采取第一种方法,下面是代码。
第一种方法:
第二种方法:
面对网络编程中的发送文件时的粘包问题,我的处理方法是在要发送文件前,首先发送文件的长度,获取的文件长度是UlongLong类型的整数,发送
时需要转换为字符串,有两种处理方法,第一种是使用C++中的流,第二种是使用系统提供的一个函数,当然第二个是比较方便,但是在知道有第二个
方法前,只能折中采取第一种方法,下面是代码。
第一种方法:
// 获取文件长度 void CTestCFileLengthDlg::TestFileLength() { CFileDialog dlg(TRUE); if(IDOK == dlg.DoModal()) { CString strFilePath = dlg.GetPathName(); CFile file; if(file.Open(strFilePath, CFile::modeRead | CFile::typeBinary)) { ULONGLONG ullLen(0); ullLen = file.GetLength(); CString msg; msg.Format(_T("文件长度为:%llu"), ullLen); std::stringstream buffer; buffer << ullLen; char szLength[512] = {0}; memcpy(szLength, buffer.str().c_str(), strlen(buffer.str().c_str())); //Is const char * MessageBox(msg); } else { return ; } } else { return ; } }
第二种方法:
// 发送文件长度 char szFileLength[21] = {0}; ULONGLONG ullLen(0); CFile file; if(!file.Open(pszFilePath, CFile::modeRead | CFile::typeBinary)) { // 打开文件失败 return FALSE; } ullLen = file.GetLength(); _i64toa_s(ullLen, szFileLength, 20, 10); if(SOCKET_ERROR == send(socket, szFileLength, 20, NULL)) { // 发送文件长度失败 file.Close(); return FALSE; }
相关文章推荐
- tcp/ip 网络编程自定义协议粘包处理
- 网络编程中的粘包处理
- c/c++网络编程 对象的传输 以及 TCP粘包处理 解析
- 【网络编程】TCP异常断开处理方法
- 涉及网络编程时,需要用到的几个常用方法
- ora-12154 tns 无法处理服务名(执行的程序途径不一致导致,枚举网络数种方法,大家还有其他解决办法?)
- Java网络编程基础 Datagram类使用方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法 (转)
- 解决java网络编程IPv6带来的问题方法
- php5编程中的异常处理详细方法介绍
- 提高IOCP 效率的一些方法,技巧 (来自WINDOWS 网络编程第二版)
- 介绍一些在网络编程中常用的工具方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- 涉及网络编程时,需要用到的几个常用方法
- 网络编程的技术和方法
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- C#编程技巧之常用文件名、路径处理方法
- ARP欺骗引起的网络瘫痪及处理方法
- linux嵌入式编程高手历程系列8-NFS网络文件系统配置方法