关于WSASend的相关操作??急,在线等!!

robin_yao 2006-04-10 10:19:47
我用的是重叠IO模型
在发送数据的时候,大家看看我的理解对不对??该怎么理解?

1.我觉得WSASend没必要用WSAWaitForMultipleEvents来通知是否完成(WSARecv来需要通知),应该看返回值就行了。如果返回值小于你提交的BUF的大小,就 手工 再重发一下。一直到发完为止

2.既然WSASend没必要和事件(Event)关联来获得通知,那WSASend参数中的WSAOVERLAPPED该如何初始化呢?我不太明白这个WSAOVERLAPPED和SOCKET关联的时候到底是什么一个关系(我理解的是一个SOCKET的操作对应一个WSAOVERLAPPED,要是我循环Send数据,就应该用一个WSAOVERLAPPED?)

3.我现在把WSASend放在另外一个线程中的,但是如果需要在WSARecv到一个数据包后WSASend一个返回包,就直接写WSASend吗?
...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevecrisewu 2006-04-10
  • 打赏
  • 举报
回复
你都把异步理解成为同步了

你看看windows网络编程一书,自己理解的影响会深刻很多
striking 2006-04-10
  • 打赏
  • 举报
回复
修正一下. 对于1 . 如果wsasend 调用后返回0 表示发送成功. 否则就调用WSAGetLastError()判断是否网络问题, 或者还处于系统发送状态.

msdn 这样说的:
If no error occurs and the send operation has completed immediately, WSASend returns zero. In this case, the completion routine will have already been scheduled to be called once the calling thread is in the alertable state. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError. The error code WSA_IO_PENDING indicates that the overlapped operation has been successfully initiated and that completion will be indicated at a later time. Any other error code indicates that the overlapped operation was not successfully initiated and no completion indication will occur.

striking 2006-04-10
  • 打赏
  • 举报
回复
1. no. 返回值是不能判断是否发送成功的. 重叠的目的就是处理并发的问题. 通常发出象wsasend这样的请求, 函数是立即返回的. 所以你需要通过事件来获知结果, 例如还处于待决状态, 或者已经发送成功.

2. 其它的问题就基于1了.
robin_yao 2006-04-10
  • 打赏
  • 举报
回复
4.还有一个问题就是我在一个SOCKET上同一个操作用两个WSAOVERLAPPED,有问题吗?
还是用一个比较好。比如WSASend,我在一个线程中不断轮询DB取数据并且发送。
还有在MIAN函数中收到某包后要回也要WSASend.这两个WSASend是用一个WSAOVERLAPPED呢,还是用两个?
robin_yao 2006-04-10
  • 打赏
  • 举报
回复
感谢striking(硬撑者)

18,356

社区成员

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

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