游戏开发论坛

 找回密码
 立即注册
搜索
楼主: nocture

Recv函数执行时间过长,请问大家如何解决?

[复制链接]

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-27 13:30:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

非堵塞 被你去掉了。

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 13:41:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

switch( WSAGETSELECTEVENT(lParam) )
{
  case FD_READ:
  {
     WSAAsyncSelect(_socket, _hwnd, NETCLIENT_EVENT_MSG, 0);
     int iMode = 0;
     ioctlsocket(_socket, FIONBIO, (u_long FAR*) &iMode);
     recv();
     .....
     WSAAsyncSelect(_socket, _hwnd, NETCLIENT_EVENT_MSG,
               FD_CONNECT | FD_CLOSE | FD_READ);
  }
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-27 13:42:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

用非阻塞的话,注意处理一下消息结构。
阻塞模式的话,你只能开线程去收。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 13:45:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

跟这个没有关系,有些时候就是很长

FIONBIO
Enable or disable nonblocking mode on socket s. lpvInBuffer points at an unsigned long (QOS), which is nonzero if nonblocking mode is to be enabled and zero if it is to be disabled. When a socket is created, it operates in blocking mode (that is, nonblocking mode is disabled). This is consistent with BSD sockets.
The WSAAsyncSelect or WSAEventSelect routine automatically sets a socket to nonblocking mode. If WSAAsyncSelect or WSAEventSelect has been issued on a socket, then any attempt to use WSAIoctl to set the socket back to blocking mode will fail with WSAEINVAL. To set the socket back to blocking mode, an application must first disable WSAAsyncSelect by calling WSAAsyncSelect with the lEvent parameter equal to zero, or disable WSAEventSelect by calling WSAEventSelect with the lNetworkEvents parameter equal to zero.

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 13:51:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

注释掉以下两句也没有用啊
int iMode = 0;
ioctlsocket(_socket, FIONBIO, (u_long FAR*) &iMode);

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-9-27 13:52:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

跟阻塞和非阻塞是有关系的。
非阻塞的模式不会等,会直接返回,不过一次不一定收完。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 13:52:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

不信的话你们自己写一段然后分析一下recv这个函数,时间消耗有的时候就是很长

不过
if (!socket_recv(&datalen, 1, wParam, lParam))//测试消耗140多毫秒


我不清楚你在socket_recv这个函数里干些什么

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 13:53:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

The WSAAsyncSelect or WSAEventSelect routine automatically sets a socket to nonblocking mode

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 13:55:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

没什么阻塞非阻塞的,用了WSAAsyncSelect or WSAEventSelect 就是非阻塞的

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-27 14:01:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

唉,要详细说的话要说一大堆,
你先用setsockopt设置SO_RCVTIMEO这个选项试试吧。(上面的两行不用注释掉)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-18 22:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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