WSAEventSelect model 的 两个 问题 ? 谢谢

BOYGUARD110 2006-01-23 02:04:52

////////////////////////////////////////////////////////////////
//
// 第 1 个 问题
//

WSAEventSelect model 调用 send 函数的返回值为什么 总 不 是 SOCKET_ERROR ??

环境: WIN2K , VC++6.0

WSAEventSelect model send 函数的 返回值

#1 应该 总是 为 SOCKET_ERROR ?

#2 还是 可以 为 SOCKET_ERROR ,当是这个值的时候,再根据规定去处理 ?

我的实验结果 是 send 直接 发送直接 成功了 , 返回值 就是 发送的 字节数,

而不是 SOCKET_ERROR




////////////////////////////////////////////////////////////////
//
// 第 2 个 问题
//

WSAEventSelect model 发送数据 和 接收数据 需要 进行 速率的 控制吗?

我的实验代码:

server 端 :

while(1)
{
等待 FD_READ ,
recv

}



client 端:

while(1)
{


r = send ()// 这个 函数调用 直接 成功 ,每次 100 字节

WSAWaitForMultipleEvents();

Sleep(1000);

}


实验结果:

如果 不在 client 加一个 Sleep 进行 延时 ,

client 的 while 在执行了 若干次 ( 我的实验结果是 300 次左右 ) ,

send 函数的 返回值 就会突然 变成 SOCKET_ERROR ,

WSAGetLasterror 返回值 为 WSAEWOULDBLOCK ,

并且 接下来的 结果 WSAWaitForMultipleEvents 总是 timeout



////////////////////////////////////////////////

请给些提示或指导,谢谢

...全文
127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BOYGUARD110 2006-01-25
  • 打赏
  • 举报
回复

要回家了,回来再说了, 先结贴

祝大家在新的一年里: 身体健康 万事如意

谢谢
nuaawenlin 2006-01-23
  • 打赏
  • 举报
回复
2,快发送端和慢接收端的毛病,客户端发送很快,而服务器没有来得及接收数据,那么客户端的tcp发送窗口被填满的时候,会导致send返回错误。
jazy 2006-01-23
  • 打赏
  • 举报
回复
第 1 个 问题
send不一定返回SOCKET_ERROR,其实你的第 2 个 问题已经回答了这一点:只有快速重复send多次才有可能引起block,因为当时socket缓冲区被占用太多了。
nuaawenlin 2006-01-23
  • 打赏
  • 举报
回复
1,非阻塞的套接字send才会返回SOCKET_ERROR,使用WSAGetLastError返回值 为 WSAEWOULDBLOCK ,这是正常的,如果不是这个值,那么说明真的是出现了错误。

你的套接字是阻塞的,所以send直到数据完全拷贝到系统缓冲区才返回。

其实,阻塞和非阻塞套接字,在send的时候,时间差别不大,因为send只是把数据从用户缓冲区拷贝到系统缓冲区,这个时间应该很短。
starcbh 2006-01-23
  • 打赏
  • 举报
回复
r = send ()// 这个 函数调用 直接 成功 ,每次 100 字节

WSAWaitForMultipleEvents();


不知道你要搞什么。。。wait干嘛啊?
BOYGUARD110 2006-01-23
  • 打赏
  • 举报
回复
UP
DentistryDoctor 2006-01-23
  • 打赏
  • 举报
回复
WSAEventSelect / WSAWaitForMultipleEvents?

WSAGetLastError()=?

18,356

社区成员

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

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