游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2492|回复: 5

★★★★★[求助]~~关于WinSock的接收与发送~~

[复制链接]

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-4-23 15:26:00 | 显示全部楼层 |阅读模式

最近才发现一个问题,如果服务端执行多次send()发送多段数据给客户端,然后客户端隔了一段时间后才执行recv(),结果收到的不是服务端第一次发送的数据,而是多次发送的数据"总合"。
例:send(s,"123",3,0);send(s,"45",2,0);send(s,"6",1,0); →
recv(s,buf,1024,0); // buf为"123456"

但是我想对应每段数据来逐步处理,send()多少次,就recv()多少次,而不是一次性recv()。
请问,如何实现?可否通过设置send()和recv()的第4个参数来实现?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20527
发表于 2004-4-23 15:32:00 | 显示全部楼层

Re:★★★★★[求助]~~关于WinSock的接收与发送~~

可以在你发的数据里面做处理,比如对发送的数据做封包,然后接收组合数据后进行数据包的解读。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-4-23 15:37:00 | 显示全部楼层

Re:★★★★★[求助]~~关于WinSock的接收与发送~~

不过这样就必须在把每段数据的长度加入到数据里吧?虽然只是多了1字节,但也觉得浪费了呀,而且处理起来也不方便啊~

因为我尝试过把send和recv的flag参数换为MSG_PEEK或MSG_OOB,结果让我觉得可以通过正确的设置来到达到想要的效果,也许这是我的凭空想象吧,但我还是希望可以。

感谢大哥的指点。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2004-4-24 01:53:00 | 显示全部楼层

Re: Re:★★★★★[求助]~~关于WinSock的接收与发送~~

你的确是在凭空想象,Socket无法做到一一对应的收发。假使可以这样,这种方法在编程中也难以控制,因为你根本控制不了Send()函数的调用次数,在网络不畅的情况下,socket未必能将你要发送的数据段一次发完。

你需要缓冲数据并制定自己的通信协议处理每个封包,实际操作时,你需要“浪费”的数据长度远不止1字节,比如:前同步字节、封包类型、封包长度、掩码等等。至于接收数据的方式通常有2种:

1.根据你的数据封包长度,从socket recv()指定长度的数据,每次只recv()一个封包。这种方法利用了socket的缓冲区来缓冲数据,但当接收数据的速度跟不上发送的速度时可能会加重socket的负担,另外当recv()到的数据长度还不到一个封包时,你得利用MSG_PEEK参数,让数据继续留在socket缓冲中。

2.socket中只要有数据就全部recv()下来,放到自己创建的数据缓冲区中,然后从自己的缓冲区读取封包挨个处理。虽然当接收数据的速度跟不上发送的速度时,你自己的数据缓冲区负担也很大,但这会有让你有一种"everything under control"的感觉,想必所有不喜欢MFC的家伙都会喜欢它的。

总而言之,你需要有封包的概念,并使你的应用程序能区分之。顺便提一句,参数MSG_OOB的作用只是能让你看到socket的带外数据而已。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-4-24 09:16:00 | 显示全部楼层

Re:★★★★★[求助]~~关于WinSock的接收与发送~~

tcp 是基于流的方式传输数据,其中存在数据窗口的概念,还有重发机制,所以你说的办法无法做到,udp 倒是可以这么做,但是不保证你每次都能收得到。

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-4-25 17:40:00 | 显示全部楼层

Re:★★★★★[求助]~~关于WinSock的接收与发送~~

简单处理就是关闭Nagle算法就可以了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 11:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表