关于CAsyncSocket的Send()

maomaosansan 2004-07-18 11:31:20
我的代码如下:
BOOL res=m_pMySocket->Create();
if (!res)
{
AfxMessageBox("Socket created error!");
}
res=m_pMySocket->Connect(m_Host,m_nPort);
if (!res)
if (GetLastError()!=WSAEWOULDBLOCK)
AfxMessageBox("Error! Can't connect to server!",MB_ICONEXCLAMATION);

if(GetLastError()!=WSAEWOULDBLOCK)
{
AfxMessageBox("error!");
return;
}
// while(GetLastError()==WSAEWOULDBLOCK)
// ;
CString strsend="*";
int nsend=m_pMySocket->Send(strsend,strsend.GetLength(),0);
if (nsend!=strsend.GetLength())
{
if(GetLastError()!=WSAEWOULDBLOCK)
{
AfxMessageBox("error!");
return;
}
}
在我调用send函数的时候返回值是 WSAEWOULDBLOCK 10035,也就是请求不能立刻被执行;
1:是不是在send 完成后调用OnSend()?(5分)
2:我用WPE看不到send() 的内容被发送出来,这个send一定会被阻塞不会立即执行,而我如果自己在另一个地方用send()(等待一段时间后调用)就可以看到send的内容被发送出去了;
我的问题是当send()被阻塞后它还会不会执行??如果执行了为什么在WPE中我看不到?(5分)
3:如果被阻塞后不执行我该怎么做,才能发送我要发送的内容??(求源码 50分-解决立即结贴-只限于用CAsyncSocket实现)


...全文
467 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hollandwolf 2004-10-25
  • 打赏
  • 举报
回复
碰到同样的问题了
呵呵,谢谢楼上提供的资料
danielzhu 2004-07-24
  • 打赏
  • 举报
回复
还没有解决阿?

给你看一个例子,你的是TCP还是UDP
下面一个是UDP,一个是TCP

UDP:
http://support.microsoft.com/default.aspx?scid=kb;en-us;214396

TCP server and Client:
http://support.microsoft.com/default.aspx?scid=kb;en-us;192570
门吹西风 2004-07-23
  • 打赏
  • 举报
回复
没select
gdy119 2004-07-19
  • 打赏
  • 举报
回复
我也是这么认为的,hellopine()说的有道理
用MFC提供的类只能写来玩,不能作为商业软件去卖钱!

danielzhu 2004-07-19
  • 打赏
  • 举报
回复
UP
jazy 2004-07-19
  • 打赏
  • 举报
回复
它们不是要你来调用的,是socket的通知消息函数,
比如OnConnet,这个消息在异步socket的connect真正成功时由系统触发,
你在里边写连接成功后准备做的事情就好了
hellopine 2004-07-19
  • 打赏
  • 举报
回复
做网络开发,建议直接使用WINSOCK API 函数

MFC 并没有封装多少

而且,不容易理解
jini 2004-07-19
  • 打赏
  • 举报
回复
用异步socket的时候,一句话,也要用异步函数来处理,如楼主的send,判断是否send完成的条件应该也用select函数,一般在发之前用select,然后send,如果正常的话,要么等对方回信息,要么对方断开,要么自己限时断开,没有其他形式的。
maomaosansan 2004-07-18
  • 打赏
  • 举报
回复
新问题,新发现:如果我在后面再加上如下代码:
strsend="**";
int nsend=m_pMySocket->Send(strsend,strsend.GetLength(),0);
if (nsend!=strsend.GetLength())
{
if(GetLastError()!=WSAEWOULDBLOCK)
{
AfxMessageBox("error!");
return;
}
}
就可以看到发送出去了一个 “**”;但是前面的没有发送出去,也就是说,前面的
send()不知道跑哪里玩去了。我跟踪了一下发现后一个没有阻塞,所以就发出去了,那么还是第3个问题,如果send被阻塞了,我该怎么办才那完成发送呢???
Kudeet 2004-07-18
  • 打赏
  • 举报
回复
网络我是不行,这是总结帖里的:
YourConnectFunc()
m_socket.connect();//做了连接,马上返回
m_socket.AsyncSelect(FD_CONNECT) //申请事件:连接返回后通知我,不管成功失败
//连接事件
OnConnect(int nErrCode) //参数是错误代码
//首先检查有无错误发生
//做你想做的事情,比如初始化某些变量
//...
// 我想发送数据,当网络可写时告诉我,连接中断时也告诉我,比如服务器close了
m_socket.AsyncSelect(FD_WRITE | FD_CLOSE)

OnWrite(int errocode)
//首先检查有无错误发生

//正常,网络已经可以写了
//发送数据
m_socket.send()

//我想接受服务器反馈,当由数据到达时告诉我,连接中断时也告诉我,比如服务器close了
m_socket.AsyncSelect(FD_READ | FD_CLOSE)

OnRead()
//首先检查有无错误发生

//正常,数据已经可以读了
//读取数据
m_socket.receive()
m_socket.AsyncSelect(FD_WRITE | FD_CLOSE)

Q:很多人问为什莫要多次调用AsyncSelect?
A:现在是可读的,不等于过十分钟也可读,就是说Create 一个socket时可写,不代表永远可写,等需要写的时候要在检查。
maomaosansan 2004-07-18
  • 打赏
  • 举报
回复
-----类似的,Send()如果返回WSAEWOULDBLOCK错误,我们在OnSend()处等待,Receive()如果返回WSAEWOULDBLOCK错误,我们在OnReceive()处等待,以此类推。------------

这断话我看了好几天了,OnSend()、OnReceive()等的参数和Send()、Receive()等不同,我在那里等,我需要的内容从哪里来??
gracezhu 2004-07-18
  • 打赏
  • 举报
回复
你发送的方式很容易导致阻塞,请看以下这段话:
客户方在使用CAsyncSocket::Connect()时,往往返回一个WSAEWOULDBLOCK的错误(其它的某些函数调用也如此),实际上这不应该算作一个错误,它是Socket提醒我们,由于你使用了非阻塞Socket方式,所以(连接)操作需要时间,不能瞬间建立。既然如此,我们可以等待呀,等它连接成功为止,于是许多程序员就在调用Connect()之后,Sleep(0),然后不停地用WSAGetLastError()或者CAsyncSocket::GetLastError()查看Socket返回的错误,直到返回成功为止。这是一种错误的做法,断言,你不能达到预期目的。事实上,我们可以在Connect()调用之后等待CAsyncSocket::OnConnect()事件被触发,CAsyncSocket::OnConnect()是要表明Socket要么连接成功了,要么连接彻底失败了。至此,我们在CAsyncSocket::OnConnect()被调用之后就知道是否Socket连接成功了,还是失败了。
类似的,Send()如果返回WSAEWOULDBLOCK错误,我们在OnSend()处等待,Receive()如果返回WSAEWOULDBLOCK错误,我们在OnReceive()处等待,以此类推。
还有一点,也许是个难点,那就是在客户方调用Connect()连接服务方,那么服务方如何Accept(),以建立连接的问题。简单的做法就是在监听的Socket收到OnAccept()时,用一个新的CAsyncSocket对象去建立连接,例如:

void CMySocket::OnAccept( int ErrCode )
{
CMySocket* pSocket = new CMySocket;
Accept( *pSocket );
}
于是,上面的pSocket和客户方建立了连接,以后的通信就是这个pSocket对象去和客户方进行,而监听的Socket仍然继续在监听,一旦又有一个客户方要连接服务方,则上面的OnAccept()又会被调用一次。当然pSocket是和客户方通信的服务方,它不会触发OnAccept()事件,因为它不是监听Socket。


maomaosansan 2004-07-18
  • 打赏
  • 举报
回复
up
Kudeet 2004-07-18
  • 打赏
  • 举报
回复
呵呵!帮不了,你查查以前的老帖子看。
maomaosansan 2004-07-18
  • 打赏
  • 举报
回复
up

18,363

社区成员

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

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