c++ 通过socket发送字节流

凉凉二点凉 2015-04-03 01:49:28
c++我不会,我现在有个需求,socket服务器是java写的,客户端也是java的,java发送的数据格式如下:

很简单的一个格式
|---(占4个字节,指明发送内容的长度)---| |---"具体内容,长度在头部指明" --- |

  
String contents="test";
IoBuffer buffer = IoBuffer.allocate( 4 + contents.length, false);
//buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putInt(contents.length); //java里面int占4个字节,存放contents的长度
buffer.put(content.getBytes());


那么对于c++如何封闭这种数据格式呢?
...全文
1436 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
凉凉二点凉 2016-03-18
  • 打赏
  • 举报
回复
Hi, Application.ActivePrinter is read-only but you should use ActivePresentation.PrintOptions.ActivePrinter instead. e.g. ActivePresentation.PrintOptions.ActivePrinter ="Printer Name" ActivePresentation.PrintOut Regards, Shyam Pillai
赵4老师 2015-12-10
  • 打赏
  • 举报
回复
引用 17 楼 Guccang 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
花了2个多小时看完,果然是好贴。 不过就个人而言,比较喜欢那种 遇见问题直接说解决方案的。而不是向您那样说一些是是而非的东西。 由于本人层次未达到老师的地步。因此完全不懂您在说些什么。 然而。很高兴您能推荐这样的好文章。csdn不能少像您这样的人。[/quote] 我在这个帖子里面的104楼难道没说解决方案吗?
Guccang 2015-12-08
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
花了2个多小时看完,果然是好贴。 不过就个人而言,比较喜欢那种 遇见问题直接说解决方案的。而不是向您那样说一些是是而非的东西。 由于本人层次未达到老师的地步。因此完全不懂您在说些什么。 然而。很高兴您能推荐这样的好文章。csdn不能少像您这样的人。
HxBreak 2015-06-20
  • 打赏
  • 举报
回复
楼主直接百度飞鸽传书源码就ok
luotuo44 2015-06-19
  • 打赏
  • 举报
回复
第一个字段4字节,指明长度。楼主要注意字节序问题。
走好每一步 2015-06-18
  • 打赏
  • 举报
回复
Java都是直接开车,很舒服 c++又要会车,又要会修车。
凉凉二点凉 2015-06-18
  • 打赏
  • 举报
回复
<div style="float: right;padding-right: 2px;">
商品名称: <input type="text" name="searchStr" id="searchStr" class="textbox"/>
商品状态: <select name="isRecommend" id="isRecommend" class="textbox">
<option value="1" selected="selected">全部</option>
<option value="1">上架</option>
<option value="0">下架</option>
</select>
<a href="javascript:void(0)" onclick="querybtn();" class="easyui-linkbutton" icon="icon-search">查询</a>
<a id="resetBtn" class="easyui-linkbutton" icon="icon-reload">重 置</a>
</div>
vcf_reader 2015-04-06
  • 打赏
  • 举报
回复
照猫画虎就可以了
dooX8086 2015-04-03
  • 打赏
  • 举报
回复
一般都是跟根协议定一个结构体 如 #pragma pack(1) // 字节对齐问题 struct ProtoHead{ int len; // 四字节的包长 int cmd; // 命令字 // ...协议版本什么期它的... ; // 其它 }; buffer[] // 收到来自服务器发来的数据, 在处理这个 buffer 前要注意的就是 #7 赵4老师 所指的 粘包问题,... 处理buffer 可直接强制转换 ProtoHead * ph = (ProtoHead *)buffer ph->len // 这是是长度,要注意 java 用的是 网络字节序, c++ 要看环境,所以需要转换成本地字节序 ph->len = ntohl(ph->len); // ..... 其它的 int 型 short 等都需要转换 ph->cmd = ntohl(ph->cmd); // 用这个 cmd 来确定这是个什么数据包 这般情况下协议都这样设计 // -------------------------------------------------- 要注意和处理问题 粘包 | 字节序
leasor 2015-04-03
  • 打赏
  • 举报
回复
为什么我完全看不懂你的需求> 那就接分吧.
zyb3421 2015-04-03
  • 打赏
  • 举报
回复
例子只是发了个服务器端的部分代码: 参考下吧 #include <winsock.h> #include <windows.h> #include <stdio.h> #pragma comment(lib, "wsock32.lib") int main(int argc, char* argv[]) { WSAData wd; WSAStartup(MAKEWORD(2, 0), &wd); SOCKET server; unsigned long opt = 1; server = socket(AF_INET, SOCK_STREAM, 0); if(server == INVALID_SOCKET) { printf("创建端口失败\n"); //closesocket(server); WSACleanup(); return 0; } sockaddr_in addr; addr.sin_port = 8080; addr.sin_family = AF_INET; //127.0.0.1表示回写地址,一般用来测试所用,表示自己和自己通讯 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //bind(server, (LPSOCKADDR)&addr, sizeof(addr)); if(SOCKET_ERROR == bind(server, (LPSOCKADDR)&addr, sizeof(addr))) { printf("绑定失败\n"); closesocket(server); WSACleanup(); return 0; } //while(SOCKET_ERROR == listen(server, 3)) //listen(server, 3); if(SOCKET_ERROR == listen(server, 1)) { printf("监听失败\n"); closesocket(server); WSACleanup(); return 0; } SOCKADDR_IN clientaddr; int len = sizeof(clientaddr); SOCKET client = accept(server, (LPSOCKADDR)&clientaddr, &len); if(INVALID_SOCKET == client) { printf("接受连接失败\n"); closesocket(server); WSACleanup(); return 0; } if(ioctlsocket(server, FIONBIO, &opt)==0) printf("设置非阻塞式成功"); char str[1024] = "Hello World"; int ret = 1; while(ret != SOCKET_ERROR && ret != 0) { printf("%d\n", ret); ret = recv(client, str, sizeof(str), 0); //printf("%d\n", ret); // if(ret != 0) // { // printf("%s\n", str); // //memset(str, 0, sizeof(str)); // //Sleep(1000); // } // else // { // break; // } } closesocket(server); WSACleanup(); return 0;
bear234 2015-04-03
  • 打赏
  • 举报
回复
c++ 和 java 互相用socket发送数据很常见啊 不管什么语言,只要数据进了socket 都一样 不用担心 该怎么处理怎么处理
赵4老师 2015-04-03
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
只此冒泡君 2015-04-03
  • 打赏
  • 举报
回复
2楼 3楼呢!!
只此冒泡君 2015-04-03
  • 打赏
  • 举报
回复
用 结构体吧 ~~
  • 打赏
  • 举报
回复
百度一下c++socket例子,肯定一大堆
凉凉二点凉 2015-04-03
  • 打赏
  • 举报
回复
byte[] contents = content.getBytes(Charset.forName("UTF-8"));
		 	
	        IoBuffer buffer = IoBuffer.allocate( 4 + contents.length, false);  
	        //buffer.order(ByteOrder.BIG_ENDIAN);
	        buffer.putInt(contents.length);  
	        buffer.put(content.getBytes());
	        buffer.flip();  
	        out.write(buffer);

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧