connect后,系统缓冲区未满,怎样触发OnSend时间?

netree 2004-03-31 12:49:04
FD_WRITE是由connect和send触发的,当connect成功后,系统会发FD_WRITE消息通知你“连接成功,此时可以发送数据”;
当你调用send 后,如果发生WSAEWOULDBLOCK错误,系统就知道你还有数据要发送,但此时缓冲区已满,所以系统会在适当的时候(缓冲区空闲)发FD_WRITE 通知你“此时可以继续发送上次没发完的数据”,直到你某次调用send后未发生WSAEWOULDBLOCK错误,系统知道你的数据已经发完,之后就不通知你了。

我的程序要传送一个很小的内容,比如是用户名,当我connect后,怎么触发OnSend时间。(这时OnSend不会自动触发,因为我的缓冲区没满。)
...全文
85 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovevc 2004-03-31
  • 打赏
  • 举报
回复
异步方式我不太清楚,头大。程序流程转来转去。
不如开个线程,使用阻塞方式清晰。
netree 2004-03-31
  • 打赏
  • 举报
回复
最近看了很多关于网络编程方面的资料。
资料中说Conncet成功后,系统会自动触发OnSend时间,而我在系统调用后,在OnSend事件中加一个AfxMessageBox怎么没反映,而一定要我显示地调用一下Send

//main.cpp主程序
//CMySock继承于CAsyncSocket
main
{
...
CMySock mySock;
mySock.Create();
mySock.Connect(ip,port);
...
}

CMySock::OnSend(int nErrorCode)
{
AfxMessageBox("ok");
CAsyncSocket::OnSend(nErrorCode);
}
netree 2004-03-31
  • 打赏
  • 举报
回复
To ilovevc:
刚刚connect成功后,调用send,把数据拷贝到系统的send buffer,但是此时send buffer尚未填满,系统会调用OnSend吗?会把数据真正发出去吗?
(事实上好象把数据发出了,但是根据异步非阻塞原理,系统缓冲区数据未满,就不会调用OnSend,发送数据吧。)

老问题:如果刚刚connect成功后,一定要通过OnSend该怎么办?

初次接触网络编程,还望不吝赐教。
ilovevc 2004-03-31
  • 打赏
  • 举报
回复
我指的是你刚刚connect成功,然后send几个字节,根本就不必要等待,这个是很健壮的,简直健壮得一塌糊涂,跟网络无关。
send成功不表示数据已经发送出去了,只是表示数据已经拷贝到系统的send buffer中了。 你想像一下,你初次使用这个socket,难道它的send buffer连几个字节都放不下吗?

netree 2004-03-31
  • 打赏
  • 举报
回复
TO worldcup:显示调用CAsyncSocket的select(FD_WRITE),依然不能触发OnSend事件。
TO ilovevc:直接send是可以的,但是如果考虑到程序的健壮性,考虑到网络上可能发生的各种情况,一定要通过OnSend该怎么办?
ilovevc 2004-03-31
  • 打赏
  • 举报
回复
当connect后,如果马上传送一个很小的内容,根本就不用考虑这么多,直接发送完事,绝对不可能阻塞,socket的发送buffer好歹至少也有个几K. 传个用户名那更加不在话下.
worldcup 2004-03-31
  • 打赏
  • 举报
回复
WSAAsyncSelect(FD_WRITE);

18,356

社区成员

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

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