用完成端口投递一个ConnectEx事件产生的问题!!

hewittlee 2007-05-28 12:44:11
如题!当完成一次投递后,运行正常,当投递第二次时,WSAGetLastError()就返回10052的错误,请问各位高手如何解决!!急!!
...全文
916 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zottff 2007-05-30
  • 打赏
  • 举报
回复
连接关闭再启动程序重新连接?
------------
是完全退出程序重新运行还是没有退出程序只是关闭连接后再重新连接?应该是后者吧?
那么问题应该出现在关闭连接部分和初始化连接变量部分,跟踪调试一下看看两次连接的各个连接变量有什么不同?
hewittlee 2007-05-30
  • 打赏
  • 举报
回复
to zottff():
是第一次的连接关闭再启动程序重新连接,设置断点时都是发现在投递完PostConnet之后,用GetQueuedCompletionStatus返回结果时就发生错误了。
zottff 2007-05-30
  • 打赏
  • 举报
回复
当完成一次投递后,运行正常,当投递第二次时,WSAGetLastError()就返回10052的错误
---------------
是将第一次的连接关闭再重新连接还是又有一个连接?不过我看了你的代码,感觉问题不一定出现在你贴出来的这部分代码上,因为能成功完成一次连接,所以从表面是很难看出问题的,必须前后连贯来看,分析投递第二次时与第一次投递有什么不同?二次投递公用了什么变量?仔细看一下连接前的初始化部分,如果有关闭的话还要看一下关闭时的变量释放部分,还可以在发送和连接函数中设置断点调试,看看发生错误前都发生了什么操作,确认错误是否是由connectex直接触发的
hewittlee 2007-05-30
  • 打赏
  • 举报
回复
to zottff():
是完全退出程序重新运行.我已发了具体程序给你看了!
zottff 2007-05-29
  • 打赏
  • 举报
回复
暂时没看出问题,帮你顶一下
  • 打赏
  • 举报
回复
当该操作在进行中,由于保持活动的操作检测到一个故障,该连接中断。
hewittlee 2007-05-28
  • 打赏
  • 举报
回复
int PostConnect(SOCKET_OBJ *sock,BUFFER_OBJ *connobj)
{
DWORD bytes;
int rc;

connobj->operation = OP_CONNECT;

rc = sock->lpfnConnectEx(
sock->s,
(SOCKADDR *)&connobj->addr,
connobj->addrlen,
connobj->buf,
connobj->buflen,
&bytes,
&connobj->ol);

if(rc == FALSE)
{
if (WSAGetLastError()!=WSA_IO_PENDING)
{
fprintf(stderr, "PostConnect: ConnectEx failed: %d\n",
WSAGetLastError());
return SOCKET_ERROR;
}
}

InterlockedIncrement(&sock->OutstandingOps);

//printf("POST_CONNECT: op %d\n", sock->OutstandingOps);

return NO_ERROR;
}

int PostRecv(SOCKET_OBJ *sock, BUFFER_OBJ *recvobj)
{
WSABUF wbuf;
DWORD bytes,
flags;
int rc;


recvobj->operation = OP_READ;

wbuf.buf = recvobj->buf;
wbuf.len = recvobj->buflen;

flags = 0;

rc = WSARecv(
sock->s,
&wbuf,
1,
&bytes,
&flags,
&recvobj->ol,
NULL
);

if (rc == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
fprintf(stderr, "PostRecv: WSARecv* failed: %d\n", WSAGetLastError());
return SOCKET_ERROR;
}
}

// Increment outstanding overlapped operations
InterlockedIncrement(&sock->OutstandingOps);

//printf("POST_READ: op %d\n", sock->OutstandingOps);

return NO_ERROR;
}

int PostSend(SOCKET_OBJ *sock, BUFFER_OBJ *sendobj)
{
WSABUF wbuf;
DWORD bytes;
int rc;

sendobj->operation = OP_WRITE;

wbuf.buf = sendobj->buf;
wbuf.len = sendobj->buflen;

rc = WSASend(
sock->s,
&wbuf,
1,
&bytes,
0,
&sendobj->ol,
NULL
);

if (rc == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
fprintf(stderr, "PostSend: WSASend* failed: %d\n", WSAGetLastError());
return SOCKET_ERROR;
}
}

// Increment the outstanding operation count
InterlockedIncrement(&sock->OutstandingOps);
InterlockedDecrement(&sock->SendCount);

//printf("POST_SEND: op %d\n", sock->OutstandingOps);

return NO_ERROR;
}
hewittlee 2007-05-28
  • 打赏
  • 举报
回复
各位高手问题在那阿?在下面WSAGetLastError检测到52的错误!
while (1)
{
error = NO_ERROR;

rc = GetQueuedCompletionStatus( CompletionPort,
&bytes,
(PULONG_PTR)&sockobj,
&lpOverlapped,
2000);
if (rc == 0)
{
if (((error = GetLastError()) == WAIT_TIMEOUT) ||
(error == STATUS_TIMEOUT))
{
PrintStatistics();
lastprint = GetTickCount();

}
else
{
fprintf(stderr, "GetQueuedCompletionStatus failed: %d\n", WSAGetLastError());
rc = WSAGetOverlappedResult(
sockobj->s,
lpOverlapped,
&bytes,
FALSE,
&flags
);
error = WSAGetLastError();
}
} else
{
bufobj = CONTAINING_RECORD (lpOverlapped ,BUFFER_OBJ ,ol);

if(HandleIO(sockobj,bufobj,bytes,error)==0)
{
break;
}
}
}
hewittlee 2007-05-28
  • 打赏
  • 举报
回复
PostConnect(sockobj, connobj)之后;
while (1)
{
error = NO_ERROR;

rc = GetQueuedCompletionStatus( CompletionPort,
&bytes,
(PULONG_PTR)&sockobj,
&lpOverlapped,
2000);
if ( rc == 0)
{
//error
}
else
{
bufobj = CONTAINING_RECORD (lpOverlapped ,BUFFER_OBJ ,ol);

if(HandleIO(sockobj,bufobj,bytes,error)==0)
{
break;
}
}
}

int HandleIO(SOCKET_OBJ *sock, BUFFER_OBJ *buf, DWORD BytesTransfered, DWORD error)
{
BUFFER_OBJ *recvobj=NULL, // Used to post new receives on accepted connections
*sendobj=NULL; // Used to post new sends for data received
BOOL bCleanupSocket;
int rc,
i;

bCleanupSocket = FALSE;
EnterCriticalSection(&sock->SockCritSec);

if( error != NO_ERROR)
{
FreeBufferObj(buf);

if (error == WSAECONNREFUSED)
{
InterlockedIncrement(&gCurrentConnections);
}

if ( sock->OutstandingOps == 0)
{
cout<<"Freeing socket obj in GetOverlappedResult!"<<endl;
RemoveSocketObj(&gConnectionList, sock);
FreeSocketObj(sock);
InterlockedDecrement(&gCurrentConnections);
}

if (gConnectionList == NULL)
return 0;
}
else if(buf->operation == OP_CONNECT){

int optval =1;

//Update counters

rc = setsockopt(
sock->s,
SOL_SOCKET,
SO_UPDATE_CONNECT_CONTEXT,
(char *)&optval,
sizeof(optval)
);

if (rc == SOCKET_ERROR)
{
fprintf(stderr, "setsockopt: SO_UPDATE_CONNECT_CONTEXT failed: %d\n",
WSAGetLastError());
}

sock->bConnected = TRUE;

// Post the specified number of receives on the succeeded connection
for(i=0; i < gOverlappedCount ;i++)
{
cout<<"read";
recvobj = GetBufferObj(gBufferSize);

if (PostRecv(sock, recvobj) != NO_ERROR)
{
FreeBufferObj(recvobj);
//bCleanupSocket = TRUE;
error = SOCKET_ERROR;
break;
}
}

for(i=0; ((i < gOverlappedCount) && (!bCleanupSocket)) ;i++)
{
cout<<"send";
sendobj = GetBufferObj(gBufferSize);

if (gTransmitFile)
{
//rc = PostTransmitFile(sock, sendobj);
}
else
{
rc = PostSend(sock, sendobj);
}
if (rc != NO_ERROR)
{
FreeBufferObj(sendobj);
// bCleanupSocket = TRUE;
error = SOCKET_ERROR;
break;
}
if (sock->SendCount == 0)
break;
}

FreeBufferObj(buf);
}
else if(buf->operation == OP_READ)
{
if ((BytesTransfered > 0) && (!sock->bClosing))
{
/*InterlockedExchangeAdd(&gBytesRead, BytesTransfered);
InterlockedExchangeAdd(&gBytesReadLast, BytesTransfered);*/

if (PostRecv(sock, buf) != NO_ERROR)
{
// In the event the recv fails, clean up the connection
FreeBufferObj(buf);
// bCleanupSocket = TRUE;
error = SOCKET_ERROR;
}

}
else
{
// Graceful close - the receive returned 0 bytes read
sock->bClosing = TRUE;

// Free the receive buffer
FreeBufferObj(buf);

printf("zero byte read\n");
}
}
else if(buf->operation == OP_WRITE)
{
/*InterlockedExchangeAdd(&gBytesSent, BytesTransfered);
InterlockedExchangeAdd(&gBytesSentLast, BytesTransfered);*/
if (sock->SendCount > 0)
{
rc = PostSend(sock, buf);
if (rc != NO_ERROR)
{
//bCleanupSocket = TRUE;
error = SOCKET_ERROR;
}

}
else
{
// Otherwise, shutdown the socket
if (shutdown(sock->s, SD_SEND) == SOCKET_ERROR)
{
printf("shutdown failed: %d (handle = 0x%p\n", WSAGetLastError(), sock->s);
}
FreeBufferObj(buf);
}

}

if ( error!=NO_ERROR)
{
sock->bClosing = true;
}

cout<<" OutstandingOps:"<<sock->OutstandingOps;

if ((InterlockedDecrement(&sock->OutstandingOps)==0) &&
(sock->bClosing) )
{
bCleanupSocket = true;
}

LeaveCriticalSection(&sock->SockCritSec);

if (bCleanupSocket)
{
InterlockedDecrement(&gCurrentConnections);

closesocket(sock->s);
sock->s = INVALID_SOCKET;

printf("removing conneciton object\n");
if (gTimeout == -1)
{
RemoveSocketObj(&gConnectionList, sock);
FreeSocketObj(sock);
}
else if (gCurrentConnections == 0)
{
return 0;
}

if (gConnectionList == NULL)
{
printf("List is NULL\n");
return 0;
}
}

return 1;
}
littlebao 2007-05-28
  • 打赏
  • 举报
回复
代码

18,356

社区成员

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

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