代码如下: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错误?

解决方案 »

  1.   

    SOCKET工作在非阻塞方式下经常会遇到这样的错误,你可以通过
    SELECT()、WSAAsyncSelect、WSAEventSelect进行查询或消息响应
    也可以设定工作方式为阻塞,但最好使用多线程
      

  2.   

    我对select的用法不是很了解,应该怎样实现呢,请指点一下!
      

  3.   

    三言两语如何说清楚呢?要想有提高就不要偷懒,赶快找一本《windows网络编程》看看,特别是socket模型这一章。
      

  4.   

    to lichungen(阿根) :
    我就是用的windows默认的阻塞方式啊?
      

  5.   

    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错误了
      

  6.   

    如果你是继承CSocket或CAsyncSocket,默认是非阻塞的
      

  7.   

    非阻塞是很常见的,没关系,你的代码在SOCKET_ERROR不要Return,而是再做一下判断:
    if(WSAGetLastError()== WSAEWOULDBLOCK) Continue;
    else return;我就是这么用的,许多例子的都成功的;
    而且我习惯用非阻塞的,因为阻塞的情况总感觉程序挂起死掉了,不放心!
      

  8.   

    agree NewFree(新自由人) 的作法