免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2441 | 回复: 9
打印 上一主题 下一主题

请教各位关于网络编程中的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-29 12:28 |只看该作者 |倒序浏览
7可用积分
各位好, 我对网络编程没有太多经验. 想请教一下大家是怎么做的.
比如说在传送数据的时候, 有几种方式:
1.在每次传送数据之前将此次数据的长度先发送过去, 然后再进行传送, 而接收方则while (read() > 0)一起接收, 然后计算接收到的数据在大小.如果说接收到的数据等于了开始接收到的长度那么多.然后就break出这个循环.
2.使用一个结构体.

  1. struct sa
  2. {
  3.      int count;
  4.      char buf[100];
  5. };
复制代码

每次先接收四个字节的数据即count的值,其表示此次将接收多少个数据. 然后根据count的值来read()相应长度的数据. 其实这种方式与第一种差不多的. 只是说每次接收的数量少一些, 好控制一些.
其实主要是在网络编程中感觉网络因素太多了. read()的所接收到的包的大小又不一定等于其第三个参数所指定的那么多数量. 因为存在MTU, 一次write()的数据也可能会分成多个包发送.
由于在网络编程方面没有什么经验, 所以希望各位高手能指点一下. 或者说一说您平时都是怎样来进行传输的?
在此谢过!

[ 本帖最后由 cunettenuc 于 2007-7-29 12:53 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-29 13:07 |只看该作者
想怎么办就怎么办,自己制定协议,自己遵守就行了

论坛徽章:
0
3 [报告]
发表于 2007-07-29 13:28 |只看该作者
TCP是基于流的.内容你自己随意处理就好了

论坛徽章:
0
4 [报告]
发表于 2007-07-29 16:46 |只看该作者
即便是文件,你通常也不会检查一下文件大小再读,只是读到差不多的时候就停(通常是没有数据了)

论坛徽章:
0
5 [报告]
发表于 2007-07-29 23:28 |只看该作者
一般2种方式:
1. 按行读取(读到\n结束,忽略\r),类似文件中的 fgets(),然后在行数据中存放指令,适用于纯 ascii 字符集的传输。
2. 按长度读取,像 binary 数据之类。基于 tcp 协议你就不必考虑 mtu 分段分包什么的,只管读就行,如果单进程轮循的话,注意 read/recv 时可能是无阻塞调用,那么这时可以读不到预期的长度,要自己设置缓冲池。

你刚说的 {count, buf } 这种形式,跨平台考虑建议统一用 htonl htons 之类的函数统一将字节序转换为网络字节序再传输。。。。

论坛徽章:
0
6 [报告]
发表于 2007-07-29 23:40 |只看该作者
原帖由 hightman 于 2007-7-29 23:28 发表
一般2种方式:
1. 按行读取(读到\n结束,忽略\r),类似文件中的 fgets(),然后在行数据中存放指令,适用于纯 ascii 字符集的传输。
2. 按长度读取,像 binary 数据之类。基于 tcp 协议你就不必考虑 mtu 分段 ...



先谢谢.
您说的第一种方式更多地用在交互式这种方式.
第二种方式更多地用在文件传输这种方式吧?
是吗?

论坛徽章:
0
7 [报告]
发表于 2007-07-29 23:52 |只看该作者
原帖由 flw2 于 2007-7-29 16:46 发表
即便是文件,你通常也不会检查一下文件大小再读,只是读到差不多的时候就停(通常是没有数据了)



但是如果我一端要向另外一端发送两个文件,我怎么区别这两个文件呢?
我想的就是先发送文件大小, 然后再进行接收.
read()在接收到EOF的时候返回0.
但是网络上的一端如何通过write()向另一端发送EOF这个结束符呢?
望指教.谢谢!

论坛徽章:
0
8 [报告]
发表于 2007-07-30 04:40 |只看该作者
>其实主要是在网络编程中感觉网络因素太多了. read()的所接收到的包的大小又不一定等于其第三个参>数所指定的那么多数量. 因为存在MTU, 一次write()的数据也可能会分成多个包发送.

如果是TCP流,read()所收到的数据的大小和MTU没有必然联系吧?

论坛徽章:
0
9 [报告]
发表于 2007-07-30 08:32 |只看该作者
一般的:

1、为了避免黑客或网络上的巧合行为,可以在头部加入协议字,如果对安全性要求比较高,可以加密
2、你说的这种方法是可行的,但是要注意字节序和不同host之间的字长和对齐方式。
3、虽然基于一种可靠的传输协议,但是从个人经验来讲,应用层的事还是应用层来做比较好。

论坛徽章:
0
10 [报告]
发表于 2007-08-03 13:43 |只看该作者
我的处理方式,仅供参考:
包头结构:4个字节是这次发送的整个包的长度,后面是一个流水序列号
包体结构:具体的内容与自定义协议相关。
在接收方,每次先度4个字节数据,取得这次包的长度,再接收包长-4的字节数,一次收包完成,做数据处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP