代码如下: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错误?
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错误?
SELECT()、WSAAsyncSelect、WSAEventSelect进行查询或消息响应
也可以设定工作方式为阻塞,但最好使用多线程
我就是用的windows默认的阻塞方式啊?
如果send发生WSAEWOULDBLOCK错误
fd_set fd;
FD_ZERO(&fd);FD_SET(sock, &fd);
select(0, NULL, &fd, NULL, time_out);
select返回成功之后就又可以send啦(不是超时返回)!这次send通常不会有WSAEWOULDBLOCK错误了
if(WSAGetLastError()== WSAEWOULDBLOCK) Continue;
else return;我就是这么用的,许多例子的都成功的;
而且我习惯用非阻塞的,因为阻塞的情况总感觉程序挂起死掉了,不放心!