关于WSASend()的疑问,急盼!!!!

yzhgr 2007-01-31 09:24:59
我用的是重叠I/O,在用wsasend发送数据的时候有些疑问请大狭指教
发送的主要代码是这么写的,不知道这样有没有问题

while(tlen>0){
tlen=itotallen-ihassend;
if (tlen<=0) //数据发送结束
return true;

if (tlen>MAX_SEND_LEN)
tlen=MAX_SEND_LEN;

Send_Buf.len=MAX_SEND_LEN; //这里的长度到底有何作用?
Send_Buf.buf=Sock_SendBuf[ihassend];

whlie(WSASend(ss,&Send_Buf,tlen,Flags,overlapped,NULL)==SOCKET_ERROR){
if (WSAGetLastError()!=WSA_IO_PENDING){ //等待发成功后再发送第二包数据
closesocket(ss);
WSACloseEvent(hevent);
dwEventTotal--;
return FALSE;
}
Sleep(100);
}
ihassend+=lSend;
}

1.我这样在WSASend不成功后这样一直等,知道成功后再发送下一包是否正确?
2.WSABUF里的LEN长度指的是什么长度?是数据包的总长度吗?如果数据库包的总长度只有100,却给它赋值200,会有问题吗?
...全文
394 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
萧山夜雨 2007-04-25
  • 打赏
  • 举报
回复
一看到sleep就知道你程序不行。
Lighterz 2007-04-25
  • 打赏
  • 举报
回复
或者你也可以用 select 来决定何时可以再发送。
Lighterz 2007-04-25
  • 打赏
  • 举报
回复
WSASend 正确发送的时候未必返回 WSA_IO_PENDING。发送操作立即完成的时候是直接返回 0 的。只有不是立即完成才会返回 WSA_IO_PENDING,并初始化一个重叠操作。
PS:第六个参数是 LPWSAOVERLAPPED,不是 WSAOVERLAPPED。
建议启用第七个参数或用 WSAGetOverlappedResult 来等待操作结束。
zxbstrong 2007-02-02
  • 打赏
  • 举报
回复
//这里的长度到底有何作用?
MAX_SEND_LEN may be the length of Sock_SendBuf,just like defining Sock_SendBuf below:

char Sock_SendBuf[MAX_SEND_LEN];
hhcjb 2007-02-02
  • 打赏
  • 举报
回复
参考这个:
http://www.vckbase.com/document/viewdoc/?id=1732
yzhgr 2007-02-01
  • 打赏
  • 举报
回复
哪位有发送的例子,能不能发一个给小弟看一看呢?
如果要分几次发送,那么怎样用WSASend,怎样设置事件等待
yzhgr 2007-02-01
  • 打赏
  • 举报
回复
楼上的,谢谢你的恢复!
请问如果是用事件通知,对发送和接收是在同一个线程好呢?还是各开一个线程呢?
东文-桑晨 2007-02-01
  • 打赏
  • 举报
回复
发送和接收各开一个线程
yzhgr 2007-02-01
  • 打赏
  • 举报
回复
没有人再指点指点了吗?
DentistryDoctor 2007-01-31
  • 打赏
  • 举报
回复
//这里的长度到底有何作用?
应该是实际的数据长度吧

可以用以下方法来处理重叠请求
1.事件通知
2.完成例程

18,357

社区成员

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

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