想看概念的去这里:

原创:黏贴请说明出处

http://www.roboby.com/linux_socket_how_to_clear_receive_buffer.html

http://www.cnblogs.com/khler/archive/2011/05/16/2047362.html

http://www.cnblogs.com/my_life/articles/5363527.html

寻找的参考文档: 看着确实难受

自己改下备注

发送方封包

PACKAGE_HEAD

pPackageHead;

//PACKAGE_HEAD

包头结构体

除了结构体也可以是别的类型以及大小

char

PackageHead[1024];

int

headLen

= sizeof(PACKAGE_HEAD);

// 结构体头部的长度

int

packgeContextLen

= strlen(packageContext);

//发送的数据的长度

pPackageHead->nDataLen

= packgeContextLen;//自己定义的包的大小

char

*packge

= (char*)malloc(headLen

+ packgeContextLen);

//包的内存分配

memset(packge, 0, headLen + packgeContextLen);

//

清空

char

*packgeCpy

= (char*)memcpy(packge,

(char*)&pPackageHead,

headLen);//拷贝包头里面的数据

packgeCpy

+= headLen;

//拷贝包内容里面的数据

packge

= (char*)memcpy(packgeCpy,

(char*)&packageContext,

packgeContextLen);

int

ret = 0;

ret

= send(m_hSocket, packge, headLen + packgeContextLen,

0); //发送包的内容

if

(ret

== SOCKET_ERROR || ret == 0)

{

return

ret;

}

//  有上面的解释下面的应该可以看懂了

接收方解包

char

PackageHead[1024];

char

PackageContext[1024*20];

int

len;

PACKAGE_HEAD

*pPackageHead;

//PACKAGE_HEAD

包头结构体

while(

m_bClose

== false

)

{

memset(PackageHead,

0, sizeof(PACKAGE_HEAD));

len = ReceiveSize(m_TcpSock,

(char*)PackageHead,

sizeof(PACKAGE_HEAD));

//接收包头

if( len == SOCKET_ERROR )

{

break;

}

if(len == 0)

{

break;

}

pPackageHead

= (PACKAGE_HEAD *)PackageHead;

memset(PackageContext,0,sizeof(PackageContext));

if(pPackageHead->nDataLen>0)

//根据包头中的数据长度,接收数据

{

len = ReceiveSize(m_TcpSock,

(char*)PackageContext,pPackageHead->nDataLen);

}

}

接收指定长度的数据函数

//接收指定长度的数据

int

ReceiveSize(SOCKET

m_hSocket, char* strData, int gLen)

{

if(strData == NULL)

return

ERR_BADPARAM;

char

*p = strData;

int

len = gLen;

int

ret = 0;

int

returnlen = 0;

while( len > 0)

{

ret = recv( m_hSocket, p+(iLen-len), iLen-returnlen, 0);

if

(ret == SOCKET_ERROR || ret == 0)

{

return

ret;

}

len -= ret;

returnlen += ret;

}

return

returnlen;

}

// 然后下面是自己写的

包定义解包封包

// 头文件

。。。。。

#define NAME_LEN 256  //linux max file name

#define TYPE char

// pack define

#pragma pack(push,1)

typedef struct packTCP

{

TYPE dataLen;

char data[NAME_LEN];

}PACK;

#pragma pack(pop)

// 包很简单dataLen 就是包头

只是个char类型当然可以自己改为结构体

//

至于版本号以及校验时间之类的传输的东西暂时不需要

// 封包

自己写的一个函数 列出服务器指定目录下的文件  传输到

客户端

int do_ls(char

*path,const int sock_fd)

{

int reG = 0;

DIR *dir;

struct dirent *ptr;

char base[COMMAND_LINE];

if( (dir=opendir(path)) == NULL )

{

perror("ser: Open dir error---do_ls\n");

exit(EXIT_FAILURE);

}

while( (ptr = readdir(dir)) != NULL )

{

if(strcmp(ptr->d_name,".") == 0 ||

strcmp(ptr->d_name,"..")==0)

{

continue;

}

else if( ptr->d_type == 8 || ptr->d_type == 10)

{

sleep(1);

PACK pack;

TYPE packHead = 0;

// pack head len

int packHeadLen = sizeof(packHead);

memset(pack.data,'\0',NAME_LEN);

//  pack.data

memcpy(pack.data,path,strlen(path));

strncat(pack.data,"/",1);

strncat(pack.data,ptr->d_name,strlen(ptr->d_name));

// pack data len

packHead  =  strlen(path) +

1 + strlen(ptr->d_name);

char *pPack = (char *)malloc(packHeadLen + packHead)

;

memset(pPack,'\0',packHeadLen + packHead);

// copy pack head

char *pPackCp = (char *)strncpy(pPack,(char

*)&packHead,packHeadLen);

// copy pack data

pPack =  (char *) strncat (

pPackCp,(char *)&(pack.data),packHead );

reG = 0;

reG = send(sock_fd,pPack,packHeadLen+packHead,0);

if( -1 == reG )

{

perror("ser: send fail\n");

exit(EXIT_FAILURE);

}

printf("%d ",pPack[0]);

printf("%s\n",pPack+1);

free(pPack);

pPack = NULL;

}

else if( ptr->d_type == 4 )

{

memset(base,'\0',sizeof(base));

strncpy(base,path,strlen(path));

strcat(base,"/");

strcat(base,ptr->d_name);

do_ls(base,sock_fd);

}

}

return 4;

}

/// 解包

客户端接收来自服务器的东西进行解包

int do_sevr_ls(char *path, const int sock_fd)

{

int reG = 0;

printf("\ncli: serverPath :\n\n");

TYPE  *pPackHead;

PACK pack;

while(1)

{

memset(pPackHead,0,sizeof(int));

char *p =(char *) pPackHead;

int pPackHeadLen = sizeof(TYPE);

int packLen = sizeof(PACK);

int recvHead = 0;

// recv pack head

recvHead =

recv(sock_fd,p+pPackHeadLen,pPackHeadLen,0);

if(recvHead == -1)

{

perror("cli: recv fail----do_sevr_ls\n");

exit(EXIT_FAILURE);

}

reG = 2;

reG = strcmp(p+pPackHeadLen ,"#");

if( 0 == reG )

{

break;

}

memset(pack.data,0,sizeof(pack.data));

int recvData = 0;

recvData = recv(sock_fd,(char

*)(pack.data),pack.dataLen,0);

printf("%s\n",pack.data);

}

printf("\n\n");

return 1;

}

//

很简单的解包和封包

java 封包_封包和解包简介相关推荐

  1. .jar文件还原java文件_从jar包还原出java源码(项目文件)

    原文转载至:https://blog.csdn.net/mxmxz/article/details/73043156 上周接到个新任务,一个遗留的接口工程需要改造,然而根据前任开发留下的文档看,这个工 ...

  2. TCP/IP 网络数据封包和解包

    这是一个网上的代码:下面列出资料并简略分析代码: TCP/IP 网络数据封包和解包  .   TCP/IP 网络数据以流的方式传输,数据流是由包组成,如何判定接收方收到的包是否是一个完整的包就要在发送 ...

  3. RTP之H264封包和解包

    RTP之H264封包和解包 目录 H264打包RTP的方法 打包方式之Single NAL Unit 打包方式之FU-A FU indication FU header 1. H264打包RTP的方法 ...

  4. 简单自定义协议的封包和解包

    简单自定义协议的封包和解包 一.通信协议 1 百度百科的解释 2 过于简单的通信协议引发的问题 3 通信协议常见内容 1.帧头 2.设备地址/类型 3.命令/指令 4.命令类型/功能码 5.数据长度 ...

  5. TCP利用封包和解包解决“粘包”问题

    本文参考自徐晓鑫<后台开发>,给出一个可实际应用的demo,该demo核心在于封包和解包的思想,以及自定义发送.接收数据. 一.TCP粘包现象 what? TCP是个"流&quo ...

  6. python中的序列封包和序列解包

    今天我们要学的内容是python中的序列封包和序列解包,在此之前,我要先给你们讲解一下python中的序列. 可能刚接触python的朋友们都听过序列这个词,那么什么是序列呢? 序列就是可以进行索引和 ...

  7. oge 封包工具 封包_什么是封包?

    oge 封包工具 封包 什么是封包? (What is Closure?) Closures are self-contained blocks of functionality that can b ...

  8. python元祖封包_[Day8]遷延蹉跎,來日無多-python終極指南:模組和封包,外掛般的超能力...

    今天要帶大家認識模組跟封包,模組的概念非常簡單,模組就是把很多副程式和變數寫在一支檔案裡面,要用的時候在載入這支檔案進來,那支檔案就稱為模組,封包就是存放著很多模組的資料夾,就這樣而已. 模組(函式庫 ...

  9. java 获取apk版本号_纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限...

    [实例简介] 纯JAVA环境获取APK信息:包名,版本,版本号,大小,权限... 代码讲解地址:http://blog.csdn.net/chillax_li/article/details/4185 ...

  10. java jsonobject的包_java_JSONObject与JSONArray的使用,1.JAR包简介要使程序可以运 - phpStudy...

    JSONObject与JSONArray的使用 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: 1.commons-lang.jar 2.c ...

最新文章

  1. 斯坦福新书《决策算法》,694页PDF免费下载
  2. 赠票 | 2019,GMIS归来!杨强、吴恩达等全球重磅嘉宾共话数据智能(上海)
  3. 设python中有模块m_关于 Python 命令中的 -m 参数(转帖)
  4. [蓝桥] 基础练习 回文数
  5. 三个Javascript内容切换效果类
  6. windows环境中利用NMake工具编译连接C++源代码
  7. Linux驱动编程 step-by-step (二) 简单字符设备驱动
  8. windows下安装Sublime+Miktex+Sumatrapdf配置LATEX环境
  9. vs工具箱里面没有工具怎么办_装机技巧系列(一):用U盘制作自己的PE工具箱...
  10. 阅读笔记11-孤独后厂村:30万互联网人跳不出的中国硅谷
  11. 局域网内通过代理服务器上网的详细设置
  12. qtp java_QTP Java swing 一些控件的遍历
  13. 用Python下载风云四号高清卫星云图
  14. ios push上移64_iOS上的C64 Basic
  15. 【ESP 保姆级教程】疯狂传感器篇 —— 案例:Mega + ESP8266 + MQ2烟雾 + MQ3酒精 + MQ7一氧化碳+ OLED + 阿里云物联网平台 + 微信小程序
  16. libdrm学习-dumb buffer
  17. STM32F4时钟系统
  18. 握手,交流从掌心开始
  19. Linux九阴真经之大伏魔拳(zabbix 监控)
  20. DELL R720服务器4块sas硬盘组成raid5扩容导致的数据丢失如何恢复

热门文章

  1. 沪深股票的复权计算(复权因子的应用)
  2. 今日金融词汇---后复权,是什么?
  3. pageadmin CMS网站建设教程:模板中获取自定义文件的url节点值
  4. 数据分析实战项目练习——物流行业数据分析
  5. 全国计算机四六级报名时间,2018年6月四六级考试报名即将截止,请抓紧时间报名!...
  6. rog幻13和幻14区别 幻13和幻14评测怎么选
  7. 温莎大学的计算机专业,2017加拿大计算机专业前七名
  8. 【NGUI】实现半圆形进度条,技能CD效果
  9. mysql 查询附近店铺SQL写法 经度 纬度 范围 距离
  10. Java日志框架的使用