我在用send发送数据时出现WSAEWOULDBLOCK 错误,怎么解决啊?

Timesboy 2003-06-27 10:27:55
代码如下:

CSocket m_socket;
int iBytes = 0;
int iCursor = 0;
int iLength = 0;
const int SEND_PACKET_LEN = 1024 * 4;

char myBuffer[1024 * 500] = "";
char sTemp[1024] = "";

for (int i = 0; i < 100; i++)
strcat(stemp, "1234567890");
for (i = 0; i < 490; i++)
strcat(myBuffer, sTemp);

iLength = strlen(myBuffer);
while (iLength > 0)
{
if ((iBytes = m_socket.Send(myBuffer + iCursor, SEND_PACKET_LEN)) == SOCKET_ERROR )
//if ((iBytes = send(m_socket.m_hSocket, myBuffer + iCursor, SEND_PACKET_LEN, 0)) == SOCKET_ERROR )
{
TRACE("error code=%d\n", iBytes);
TRACE("WSAGetLastError =%d\n", WSAGetLastError());
TRACE("错误: 无法发送数据\n");
return;
}
iLength -= iBytes;
iCursor += iBytes;
}
为什么我用第一个send不会出错,而第二个send的时候却出现了WSAEWOULDBLOCK错误?
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewFree 2003-06-27
  • 打赏
  • 举报
回复
非阻塞是很常见的,没关系,你的代码在SOCKET_ERROR不要Return,而是再做一下判断:
if(WSAGetLastError()== WSAEWOULDBLOCK) Continue;
else return;

我就是这么用的,许多例子的都成功的;
而且我习惯用非阻塞的,因为阻塞的情况总感觉程序挂起死掉了,不放心!
alanwang_ 2003-06-27
  • 打赏
  • 举报
回复
如果你是继承CSocket或CAsyncSocket,默认是非阻塞的
alanwang_ 2003-06-27
  • 打赏
  • 举报
回复
send(sock...);
如果send发生WSAEWOULDBLOCK错误
fd_set fd;
FD_ZERO(&fd);FD_SET(sock, &fd);
select(0, NULL, &fd, NULL, time_out);
select返回成功之后就又可以send啦(不是超时返回)!这次send通常不会有WSAEWOULDBLOCK错误了
Timesboy 2003-06-27
  • 打赏
  • 举报
回复
to lichungen(阿根) :
我就是用的windows默认的阻塞方式啊?
jerrytse 2003-06-27
  • 打赏
  • 举报
回复
三言两语如何说清楚呢?要想有提高就不要偷懒,赶快找一本《windows网络编程》看看,特别是socket模型这一章。
Timesboy 2003-06-27
  • 打赏
  • 举报
回复
我对select的用法不是很了解,应该怎样实现呢,请指点一下!
lichungen 2003-06-27
  • 打赏
  • 举报
回复
SOCKET工作在非阻塞方式下经常会遇到这样的错误,你可以通过
SELECT()、WSAAsyncSelect、WSAEventSelect进行查询或消息响应
也可以设定工作方式为阻塞,但最好使用多线程
joinrry 2003-06-27
  • 打赏
  • 举报
回复
agree NewFree(新自由人) 的作法

18,356

社区成员

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

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