请教一个关于recvfrom的简单问题。。。。

karlzheng 2008-04-16 05:10:42
recvfrom()接收数据时要指定一定长度,当还没接收到那么长的长度时就会阻塞等待接着接收。。。。--如果我只要它收到一个包就返回应该怎么办?--这个包多长没有定--就是说收到一个包就返回,不阻塞等待。。。。。
请高手指点一下,谢谢!
...全文
1288 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
greatdiviner 2010-08-04
  • 打赏
  • 举报
回复
看一下select模型~
wanglei5695312 2010-06-27
  • 打赏
  • 举报
回复
有乱码啊,怎么办啊?
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
star119119 2008-04-18
  • 打赏
  • 举报
回复
引用 16 楼 star119119 的回复:
不过应该是flush一类的方法.

就是socket一系列的方法.我知道unix有,windows也应该有.不过最直接的办法是关闭socket再建立连接.这个是我以前一个项目实现的,那是因为对方是一台CT机检查肠胃的机器.

我的意思是说对方sendto()发来512字节,我recvfrom()接收的长度也设了512字节。。。。缓冲区是513字节,嘿嘿。。。不起作用吗?
是的,不管用,你设置的缓冲区长度只是用来表明最大接受长度是513,但是实际接受长度只会小于等于他

没这个函数,好像有个setsockopt(),看不懂怎么设置。。。。


BOOL flg = TRUE; // Non Block
if (::ioctlsocket(udp_sd, FIONBIO, (unsigned long *)&flg) != 0)
return GetSockErrorMsg("ioctlsocket(nonblock)"), FALSE;
用这个.上面的我记错了.
aj3423 2008-04-17
  • 打赏
  • 举报
回复
网络程序推荐用抓包工具调试 如sockMon
TeddyGe 2008-04-17
  • 打赏
  • 举报
回复
你设定的每次发送的大小和每次接收的大小是否一样呢

查看一下.
把发送的Buffer的Size 和接收Buffer的Size设置成一样的
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Cricketol 的回复:]
recvfrom 接受到数据就会返回的
[/Quote]
没收到就会阻塞。。。。已经讨论过了。。。。
如果要没收到不阻塞,应该怎么办?
Cricketol 2008-04-17
  • 打赏
  • 举报
回复
recvfrom 接受到数据就会返回的
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
请高手说一说啊
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 star119119 的回复:]
不过应该是flush一类的方法.
[/Quote]
哪个类的方法?--我用的是recvfrom()API。。。
[Quote=引用 16 楼 star119119 的回复:]
收发数据长度设置一样长??什么意思
[/Quote]
我的意思是说对方sendto()发来512字节,我recvfrom()接收的长度也设了512字节。。。。缓冲区是513字节,嘿嘿。。。不起作用吗?

[Quote=引用 16 楼 star119119 的回复:]
是使用wsasetsockopt函数设置的
[/Quote]
没这个函数,好像有个setsockopt(),看不懂怎么设置。。。。
star119119 2008-04-17
  • 打赏
  • 举报
回复
现在问题不在这里,--我两边收发数据包长度设置一样长了的

现在问题是:我执行了recvfrom之后,再发包过去 对方 就收不到了!!
--请问windows下有什么函数可以清SOCKET缓冲区的?
recvfrom()有参数设置应该注意什么?

Linux下有个MSG_DONTWAIT的参数,在windows下有什么对应的参数?
===========================================
收发数据长度设置一样长??什么意思,是设置缓冲区大小一样么? 如果是,那么不会起太大作用.对于你的问题.

如果是其他的话,那就和你的程序实现有关了.

清缓冲区有对应函数,但是我也不记得了,我手头没有msdn没办法帮你查.不过应该是flush一类的方法.

Linux下有个MSG_DONTWAIT的参数,在windows下有什么对应的参数?这个是设置非阻塞么? 具体查msdn吧.但是是使用wsasetsockopt函数设置的,好象是这么写
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
已加了100分了,高手继续指点一下啊。。。。
萧乐颜 2008-04-17
  • 打赏
  • 举报
回复
学习
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 star119119 的回复:]
可能是你接收数据的逻辑处理问题.

为何不把你发送的数据修改一下格式

比如拿出头几个字节作为存储数据长度的单元.

[/Quote]

现在问题不在这里,--我两边收发数据包长度设置一样长了的

现在问题是:我执行了recvfrom之后,再发包过去 对方 就收不到了!!
--请问windows下有什么函数可以清SOCKET缓冲区的?
recvfrom()有参数设置应该注意什么?

Linux下有个MSG_DONTWAIT的参数,在windows下有什么对应的参数?
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fanskydream 的回复:]
你设定的每次发送的大小和每次接收的大小是否一样呢

查看一下.
把发送的Buffer的Size 和接收Buffer的Size设置成一样的
[/Quote]
设了一样大小了,但是不行。--现在的问题是执行了recvfrom之后,我再发包过去 对方 就收不到了!!

晕到死,不知道为什么?
在WINDOWS下这个recvfrom()函数的flag参数我设为 MSG_PEEK。。。--对方发来的数据包收到一次之后,发现即使对方没发包过来我也还能取到数据包。。。。设为MSG_OOB,又发现即使对方发包过来也没收。。。。--Linux下有个MSG_DONTWAIT的参数,在windows下有什么对应的参数啊?
star119119 2008-04-17
  • 打赏
  • 举报
回复
可能是你接收数据的逻辑处理问题.

为何不把你发送的数据修改一下格式

比如拿出头几个字节作为存储数据长度的单元.

然后可以

int recvLen = 0;
do{
recvlen+=recvfrom(s,buf);
datalen=(short)buf[0];
}while(recvlen<datalen);

这样就可以在接受完数据的时候退出循环
karlzheng 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 aj3423 的回复:]
网络程序推荐用抓包工具调试 如sockMon
[/Quote]
请问从哪里下?--最好是开源的,现在一不小心就中病毒。。。。
karlzheng 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 slq19851208 的回复:]
我也发现这样的问题 接受这边 受到了很多乱码? 不知道为什么,哪位高手解决下

[/Quote]
我没有乱码,但对方发送过来,sendto()返回值说明成功发送了512个字节,但我这边没有收到。。。。有时又好像收到两次了那样。。。。
请高手说一说应该怎么解决。。。
BTW:我用的是UDP传输
slq19851208 2008-04-16
  • 打赏
  • 举报
回复
我也发现这样的问题 接受这边 受到了很多乱码? 不知道为什么,哪位高手解决下
karlzheng 2008-04-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aj3423 的回复:]
"recvfrom()接收数据时要指定一定长度,当还没接收到那么长的长度时就会阻塞等待接着接收。。。。"
正好相反,recvfrom指定的那个长度是最大接收字节,而不是最小接收字节
只要接收到数据,就会返回
[/Quote]
嗯,谢谢指点
发现现在的问题是:我给对方发一个包,然后调用Recvfrom准备接收对方回应的包,但却没收到。。。。(对方在收到我的包后就用sendto()发送响应包回来的。。。但不知道为什么没能收到。。。)
请问能否知道问题会出在哪里?
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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