游戏开发论坛

 找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: nocture

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

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

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

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

没有意义,如果限制时间,那么数据接受不完,数据接受不完,绘图函数还是不能完成,画面还是停住了,不是解决办法

根本的方法就是把接受处理数据和绘图等不同的事情分开做

OK

参考一下别的网游客户端吧,传奇烂是烂点,学习学习也是不错的

64

主题

856

帖子

856

积分

高级会员

Rank: 4

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

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

我那个socket_recv函数就是包装了一下recv()
bool socket_recv(XXXX)
{
  int bytesRecv = recv( _socket, buffer, len, 0);
  if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
  {
    SendMessage(_hwnd, NETCLIENT_ERROR, wParam, lParam);
    return false;
  }
  return true;
}

28

主题

685

帖子

703

积分

高级会员

Rank: 4

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

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

bool socket_recv(XXXX)
{
1\buffer应该是个持续的缓冲区吧,不一定一次收得完,要考虑到几次收完
  int bytesRecv = recv( _socket, buffer, len, 0);
  if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
//可能应该是bytesRecv==SOCKET_ERROR,,::WSAGetLastError()==WSAECONNRESET,结果=0不是NETCLIENT_ERROR,而是对方正常退出,
  {
    SendMessage(_hwnd, NETCLIENT_ERROR, wParam, lParam);
    return false;
  }
  return true;
}

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

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

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

判断recv的结果用<=0来判断就好了。
另外如果要用WSAAsyncSelect的话,就得按照WSAAsync系列的函数
标准去用,而且其中关于WSAAsyncSelect的说明也只是表面上看起来
是非阻塞而已,实际上内部的实现还是阻塞,WSAAsync系列的函数和
SOCKET函数是两个不同层次的函数。最好不要在一个程序中同时用这
两种东西,要就用select+recv,要就用WSAAsyncSelect配合WSARecv

64

主题

856

帖子

856

积分

高级会员

Rank: 4

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

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

ok,今天上午看了下书,原来FD_READ表示可以 “开始“ 接收数据,而数据并没有到达本地,所以recv还是要花一定的时间接收数据将数据送往本地缓冲区,所以这就造成了140毫秒的出现。

现在我把recv所在的过程扔进了线程,这个140毫秒就不会再感觉到了。哈哈哈

5

主题

71

帖子

73

积分

注册会员

Rank: 2

积分
73
发表于 2004-9-30 03:48:00 | 显示全部楼层

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

使用线程,
否则使用一些异步方法。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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